& | 与 | 相应二进制位都为1,结果值为1,否则为0 |
| | 或 | 相应二进制位只要有一个为1,结果值为1 |
^ | 异或 | 相应二进制位值相同则为0,否则为1 |
~ | 取反 | 相应二进制位取反,即将0变1,将1变0 |
<< | 左移 | 各二进制位左移N位,右补0 (实际上是 *2的N次方) |
>> | 右移 | 各二进制位右移N位,无符号数, 高位补0 (实际是 /2的N次方) |
====================================================================
1.~x+1=-x , ~(x-1)=-x ; 负值=正值取反再加一
x & ~(x - 1)) ; x & (-x) ; x & ~x+1 ; 相同意思的三个表达,代表: 保留数字x的二进制表示中的最后一位1,
而把其他所有位都变成0. 例如:
24 的二进制为: 11000
24&(-24) 的二进制为: 1000 ,即为10进制的8; 与第4点的 findFirstOne 函数不同,特别注意了. findFirstOne(24)=3.
int lowbit(int x) { //保留数字x的二进制表示中最后一位1,其他所有位清0 return x & ~(x - 1); }
====================================================================
2.x&(x-1)把x二进制表示的最右边一个1变成0
①将x转化为2进制,看含有的1的个数
int funcB(int x) { int countx = 0; while (x) { countx++; x = x & (x - 1); } return countx; }
-------------------------------------
②判断一个数(x)是否是2的n次方
int funcA(int x) { return ((x & (x - 1)) == 0); }
====================================================================
3.交换算法:
void swap(int& a, int& b) { a ^= b; b ^= a; a ^= b; }
====================================================================
4. 测试从右边数第pos个位是否为1:
int findFirstBit1(int value) { //二进制中从右边数首个为1的位置(有多少个0) int pos = 0; if (value != 0) while ((value & 1) != 1 && (pos < 32)) { value = value >> 1; pos++; } return pos; } bool isBit1(int value, int pos) { //测从右边数pos位是否为1 return ((value >> pos) & 1); }
=======================================================================================
5. (n&-m)表达式的意义:取不大于n的最大的m的倍数,正负都通用. 其中m 为2的x次幂.