一、有符号整数位运算
1.1 左移
运算规则:符号位不变,移出位丢弃,空出位补0
正整数左移N位时低位依次填充N个0,负整数左移N位时低位依次填充N个0
0000 0010 << 1 = 0000 0100
0000 1010 << 2 = 0010 1000
1000 0010 << 1 = 1100 0100
1000 1010 << 3 = 1101 0000
1.2 右移
运算规则:符号位不变,移出位丢弃,空出位补符号位
正整数右移N位时高位依次填充N个0,负整数右移N位时高位依次填充N个1
0000 0010 >> 1 = 0000 0001
0000 1010 >> 2 = 0000 0010
1000 0010 >> 1 = 1100 0001
1000 1010 >> 3 = 1111 0001
1.3 按位与
两个位都为1时,结果才为1
0001 & 0001 = 1
0001 & 0000 = 0
0000 & 0000 = 0000
1.2 按位或
两个位都为0时,结果才为0
0001 | 0001 = 0001
0001 | 0000 = 0001
0000 | 0000 = 0000
1.2 按位取反
0变1,1变0
∼0 = 1
∼1 = 0
1.2 按位异或
两个位相同为0,相异为1
性质:
-
任何数和 0做异或运算,结果仍然是原来的数;
-
任何数和其自身做异或运算,结果是 0。
0001 ∧ 0001 = 0000 0001 ∧ 0000 = 1 0000 ∧ 0000 = 0
二、常用的小技巧
2.1 消去最后一位的1
x & (x-1)
2.2 实现乘除法
将 x 左移一位实现 × 2
a < < 1 等价于 a ∗ 2
将 x 右移一位实现 ÷ 2
a > > 1 等价于 a / 2
2.3 交换两整数
void swap(int &a,int &b)
{
a ^= b;
b ^= a;
a ^= b;
}
2.4 判断奇偶数
在二进制中,最低位决定了是奇数还是偶数,因此一个数与 1 相与,为0则是偶数,为1则是奇数