位运算
1. 算法分析
原码和补码
原码: x
反码: ~x
补码: y = ~x + 1
移位
- 左移: x << n 等价于 x * (2 ^ n)
例如:x << 2为 1 * (2 ^2) - 右移: x >> n 等价于 x / (2 ^ n), 如果x为正数,那么在最高位补上0;如果x为负数,那么在最高位补上1
使用异或来生成配偶
(0, 1), (2,3 ), (4, 5), (6, 7)为配偶对
0^1 = 1, 1 ^ 1 = 0
2^1 = 3, 3 ^ 1 = 2
4 ^1 = 5, 5 ^ 1= 4
即一个数字异或1得到它的配偶
得到最后一个1:lowit运算
lobit(n) = n & -n;
判断两个数的奇偶性是否相同
- a与b的奇偶性不同 <=> 则(a + b ) & 1 = 1;
- a与b的奇偶性相同 <=> 则(a + b ) & 1 = 0;
异或性质
结合律: (a ^ b) ^ c == a ^ (b ^ c)
对于任何x,有: x ^ x = 0, x ^ 0 = x
自反性: a ^ b ^ b = a
数据范围
2. 板子
判断一个数字每一位上的数字是几
int n = 10;
for (int i = 3; i >= 0; --i) cout << (n >> i & 1);
判断一个数是奇数还是偶数
int n = 10;
if (n & 1) cout << "奇数";
else cout << "偶数" ;
lowbit操作
// 返回最后一个1及其后面的数字:比如10 = (1010)2, 运行一次lowbit,返回10;14 = (1110)2,运行一次lowbit,返回10
int lowbit(int x)
{
return x & -x;
}