>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
>保留第一个二进制位
本文详细解读了位运算符如按位与(&), 按位或(|), 按位异或(^), 和左移(>>)在判断奇偶性、二进制位操作及状态转换中的应用,展示了如何用位运算实现类似‘二进制迭代器’的功能,以及如何用它们来处理符号整数状态的逐位展示。
2693

被折叠的 条评论
为什么被折叠?



