C++ 位运算
在C++中,位运算是直接对二进制位进行操作的运算,其操作数通常是整型或枚举类型。位运算速度极快,常用于底层编程、数据压缩、加密算法和性能优化等场景。以下是对C++位运算的详细总结:
基础位运算符
-
按位与(&)
两个对应位都为1时,结果位为1,否则为0。 -
按位或(|)
两个对应位中有一个为1,结果位为1;只有当两个位都为0时,结果位为0。 -
按位异或(^)
两个对应位不同时,结果位为1;相同时,结果位为0。 -
按位取反(~)
对操作数的每一位取反(1变0,0变1)。 -
左移(<<)
将左操作数的二进制位向左移动右操作数指定的位数,右边空出的位用0填充。 -
右移(>>)
将左操作数的二进制位向右移动右操作数指定的位数。对于无符号数,左边空出的位用0填充;对于有符号数,左边空出的位用符号位填充(算术右移)。
常见应用场景
访问和修改特定的位
- 判断某位的值:
x & (1 << n)
可判断整数x的第n位是否为1。 - 设置某位的值:
x | (1 << n)
将整数x的第n位设置为1。 - 清除某位的值:
x & ~(1 << n)
将整数x的第n位清除为0。 - 切换某位的值:
x ^ (1 << n)
对整数x的第n位进行取反。
掩码操作
- 掩码是用于选择特定位的模式,例如
0xFF
是低8位全为1的掩码。 - 提取特定的位:
x & mask
- 设置特定的位:
x | mask
交换两个变量的值
不使用临时变量交换两个变量的值:
高效计算
- 乘以 / 除以 2 的幂:
x << n
等价于x * (2^n)
,x >> n
等价于x / (2^n)
。 - 判断奇偶性:
x & 1
结果为 1 时 x 是奇数,结果为 0 时 x 是偶数。 - 计算绝对值:
枚举标志
使用位运算组合枚举值:
高级技巧
计算汉明权重(二进制中 1 的个数)
判断是否是 2 的幂
若 x & (x - 1) == 0
,则 x 是 2 的幂。
查找最低位的 1
x & -x
返回最低位 1 所在位置对应的数值。
位操作实现加法
注意事项
-
优先级问题
位运算符的优先级低于算术运算符,使用时需注意添加括号,例如(x & 0xFF)
。 -
有符号数右移
有符号数右移执行算术右移(保留符号位),可能导致意外结果。 -
性能考量
现代编译器通常会优化简单的位运算,在性能关键代码中优先使用位运算而非函数调用。 -
可移植性
不同平台对某些位操作的实现可能不同,例如移位位数超过类型宽度的行为是未定义的。
示例代码
以下是一个完整示例,展示位运算的常见用法:
位运算在 C++ 中应用广泛,但需深入理解二进制表示和补码运算才能正确使用。在底层编程或性能优化时,位运算是强大的工具。