复习
移位运算
- “<<” 左移:右边空出的位上补 0,相当于乘以 2
- “>>” 右移:左边空出的位上,如果正数,则补 0,否则,可能补 0 或者 1,取决于计算机系统。正数情况下,相当于除以 2
- “>>>” 无符号右移:左边空出的位上一律补上 0,相当于除以 2
位运算符
- & 与运算符:两个操作数相同位上同时为 1,结果数相同位上才为 1
- | 或运算符:两个操作数相同位上只要有一个为 1,结果数相同位上就为 1
- ^ 异或运算符:两个操作数相同位上不相同,结果数相同位上才为 1
灵活使用
状态管理
清除特定位(即设置为 0)
mask 特定位为 0,其他位为 1:s = s & mask
获取指定位
mask 特定位为 1,其他位为 0:r = s & mask
设置特定位(即设置为 1)
mask 特定位为 1,其他位为 0:s = s | mask
特定位取反
mask 特定位置为 1,其他位为 0:s = s ^ mask
交换变量
a ^= b;
b ^= a;
a ^= b;
判断奇偶
a & 1 = 0 偶数
a & 1 = 1 奇数
取模
a % (2^n) = a & (2^n -1);
2^n - 1 刚好是最高位 1 变成 0,剩下的低位 0 变成 1