classSolution: defreverseBits(self, n: int) -> int: result = 0 for i inrange(32): result = (result << 1) | (n & 1) n >>= 1 return result
3.4 LeetCode 371. Sum of Two Integers
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
1 2 3 4 5 6
classSolution: defgetSum(self, a: int, b: int) -> int: mask = 0xFFFFFFFF while b != 0: a, b = (a ^ b) & mask, ((a & b) << 1) & mask return a if a <= 0x7FFFFFFFelse ~(a ^ mask)
4. 高级位运算技巧
4.1 快速幂
计算 x 的 n 次方,可以用位运算优化。
1 2 3 4 5 6 7 8
defpow(x, n): result = 1 while n: if n & 1: result *= x x *= x n >>= 1 return result
4.2 格雷码生成
格雷码是一个二进制数字系统,其中两个连续的数值仅有一个位数的差异。
1 2
defgrayCode(n): return [i ^ (i >> 1) for i inrange(1 << n)]
4.3 找出不大于 N 的最大的 2 的幂
1 2 3 4 5 6 7
deflargestPowerOf2(N): N = N | (N >> 1) N = N | (N >> 2) N = N | (N >> 4) N = N | (N >> 8) N = N | (N >> 16) return (N + 1) >> 1
5. 位运算的应用场景
优化空间复杂度:用一个整数的不同位表示不同的布尔值
加速运算:某些数学运算可以通过位运算加速
状态压缩:在动态规划中使用位来表示状态
编码与解码:某些编码算法中会用到位运算
加密算法:许多加密算法中都有位运算的身影
校验和计算:计算校验和时常用位运算
图形处理:位运算在图形处理中也有广泛应用
6. 位运算的优化技巧
使用位掩码:预先计算好的位掩码可以加速位操作
并行位计数:使用特定的位模式可以并行计算多个位
查表法:对于一些复杂的位操作,可以使用预计算的查找表
位域:在 C/C++ 中,可以使用位域来紧凑地存储数据
利用特定指令集:现代 CPU 往往有专门的位操作指令,可以使用内联汇编或编译器内建函数来利用这些指令