位运算常见技巧汇总
1. 按位与(&):按位与操作符用于将两个数的对应位进行与操作。
例如,1010 & 1100 = 1000
。这个操作通常用于清零特定位或提取特定位的信息。
2. 按位或(|):按位或操作符用于将两个数的对应位进行或操作。
例如,1010 | 1100 = 1110
。这个操作通常用于将特定位设置为 1。
3. 按位异或(^):按位异或操作符用于将两个数的对应位进行异或操作。异或的性质是相同为0,不同为1。
例如,1010 ^ 1100 = 0110
。这个操作通常用于切换特定位的值。
4. 按位取反(~):按位取反操作符用于将一个数的每一位取反(0 变为 1,1 变为 0)。
例如,~1010 = 0101
。注意取反操作会受到整数的位数限制。
5. 左移(<<):左移操作符将一个数的所有位向左移动指定的位数,右侧空出的位用 0 填充。
例如,1010 << 2 = 101000
。左移操作相当于乘以 2 的幂。
6. 右移(>>):右移操作符将一个数的所有位向右移动指定的位数,左侧空出的位根据正负号使用符号位或者 0 填充。
例如,1010 >> 2 = 10
。右移操作相当于除以 2 的幂。
7. 获取第 n 位的值:
要获取一个数的第 n 位(从右向左,从 0 开始),可以使用 (num >> n) & 1
的方法。
8. 设置第 n 位的值为 1:
要将一个数的第 n 位设置为 1,可以使用 num |= (1 << n)
。
9. 将第 n 位设置为 0:
要将一个数的第 n 位设置为 0,可以使用 num &= ~(1 << n)
。
10. 交换两个数的值:使用异或操作可以在不使用额外变量的情况下交换两个数的值。
例如,a ^= b; b ^= a; a ^= b;
可以将变量 a 和 b 的值进行交换。
11. 判断奇偶性:
要判断一个数是奇数还是偶数,可以利用二进制表示中的最低位来进行判断。
奇数的二进制表示的最低位一定是 1,偶数的最低位一定是 0。因此,可以使用 (num & 1) == 1
来判断一个数是否为奇数。
12. 计算绝对值:
要计算一个整数的绝对值,可以利用其符号位。如果数为正,其符号位为 0,直接返回;如果数为负,其符号位为 1,使用取反加一的操作得到绝对值。例如,abs(num) = (num ^ (num >> 31)) - (num >> 31)
。
13. 判断是否为2的幂次方:
如果一个数是2的幂次方,那么它的二进制表示中只有一个位为1,其余位都为0。因此,可以使用 (num & (num - 1)) == 0
来判断一个数是否为2的幂次方。这是因为2的幂次方减一后,其二进制表示中的最高位为0,其余位都为1。
14. 计算整数的平方:
要计算一个整数的平方,可以利用公式 (n * n) = (1 << (2 * log2(n)))
。这个技巧避免了使用乘法运算符。
15. 判断两个数是否有相同的符号:
可以通过异或操作符来判断两个数是否具有相同的符号。如果两个数异或的结果为负数,说明它们具有相同的符号;如果异或的结果为非负数,则说明它们的符号不同。
后续总结的会继续更新~