负数的位运算:
负数进行位运算时是以补码形式进行的,如果运算结果首位为1,结果也需要求一次补码,才能得到最终的结果。
例子如下:
1.-10的补码:
#原码,负数首位为1
1000 0000 0000 0000 0000 0000 0000 1010
最右边的1和1后面的不变,首位不变,其余位取反:
#补码
1111 1111 1111 1111 1111 1111 1111 0110
2.-9的补码:
#原码,负数首位为1
1000 0000 0000 0000 0000 0000 0000 1001
最右边的1和1后面的不变,首位不变,其余位取反:
#补码
1111 1111 1111 1111 1111 1111 1111 0111
1.以 10 ^ -10 为例:
0000 0000 0000 0000 0000 0000 0000 1010
^ 1111 1111 1111 1111 1111 1111 1111 0110
= 1111 1111 1111 1111 1111 1111 1111 1100
得到的结果首位为1,所以再求一次补码:
1000 0000 0000 0000 0000 0000 0000 0100
即 -4
1.以 -9 & -10 为例:
1111 1111 1111 1111 1111 1111 1111 0111
& 1111 1111 1111 1111 1111 1111 1111 0110
= 1111 1111 1111 1111 1111 1111 1111 0110
得到的结果首位为1,所以再求一次补码:
1000 0000 0000 0000 0000 0000 0000 1010
即 -10
常用的一些规则:
1.任何数和0做异或(^)都是其自身。
-2^0 = -2 -1 ^ 0 = -1 0 ^ 0 = 0 1 ^ 0 = 1 2 ^ 0 = 2 123 ^ 0 = 123
2.n & (n-1) 可以消除n的二进制表示的最右边的一个1,常用于判断n的二进制表示中有多少个1或判断是不是2的次幂。
3.n & ~(n-1) 可以只保留n的二进制表示的最右边的一个1。
参考
位运算有什么奇技淫巧?
位运算简介及实用技巧(一):基础篇
位运算简介及实用技巧(二):进阶篇(1)
位运算简介及实用技巧(三):进阶篇(2)
位运算简介及实用技巧(四):实战篇