>n & 1
>检查n最后一个二进制位
>判断n是否为奇数,(判断偶数:n &1^1)
>n >> i & 1
>判断n的二进制第 i+1 位是否为1
>例如:搜索状态state二进制的每一位
>n &= n-1
>将n的二进制最前面(最右边)的为1的一位置零(n != 0)
>n & 0
>将第一个二进制位 置0
//设 状态state为32位符号整数数的最大值
//程序将输出:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
int state = 2147483647;
int digit = 31; //表示32位符号整数的最大位数,即31
for(int i=0; i<digit; i++)
if(state >> i &1)
cout<<i+1<<' ';
Tips:使用到的位运算优先级:>>, &, ^, |
>n | 1
>将n第一个二进制位 置1
>n |= 1 << i
>将第i+1个二进制位 置1
int set1(int &x, int i){
return x |= 1<<i-1;
}
(位运算里经常出现 “x>>i-1” 或 “ 1<<i - 1 ” 的形式,通过它可以判断或修改二进制数的每一位的“取值”,那么我们是否可以称之为 “二进制的迭代器” ?)
>n | 0
>保留第一个二进制位
>n ^ 1
>n第一个二进制位取反
>可用于某数的第i位取反
int rev(int &x, int i){
return x ^= 1<<i-1;
}
>n ^ 0
>保留第一个二进制位