- 按位与运算符(
&
)
按位与运算符对两个整数的每一位执行"与"操作。只有当两个相应位都为 1 时,结果才为 1
;否则为 0。
cpp
// 示例
int a = 5; // 二进制: 0101
int b = 3; // 二进制: 0011
int result = a & b; // 结果: 0001,即 1
2. 按位或运算符(|
)
按位或运算符对两个整数的每一位执行"或"操作。只要对应的位之一为 1,结果就为 1;
只有两个位都是 0 时,结果才为 0。
cpp
// 示例
int a = 5; // 二进制: 0101
int b = 3; // 二进制: 0011
int result = a | b; // 结果: 0111,即 7
3. 按位异或运算符(^)
按位异或运算符对两个整数的每一位执行"异或"操作。当两个相应位不相同时,结果为 1;
相同则为 0。
cpp
// 示例
int a = 5; // 二进制: 0101
int b = 3; // 二进制: 0011
int result = a ^ b; // 结果: 0110,即 6
4. 按位取反运算符( ~ )
按位取反运算符会将操作数的每一位都取反,即将 1 变为 0,将 0 变为 1。
cpp
// 示例
int a = 5; // 二进制: 0101
int result = ~a; // 结果: 1010(对于 32 位系统,它会是 -6)
5. 左移运算符(<<
)
左移运算符将操作数的所有位向左移动指定的位数。移动时,空出的低位填充 0。
左移实际上是将数字乘以 2 的指定次方。
cpp
// 示例
int a = 5; // 二进制: 0101
int result = a << 1; // 结果: 1010,即 10
6. 右移运算符(>>
)
右移运算符将操作数的所有位向右移动指定的位数。对于无符号整数,空出的高位
会填充 0;对于有符号整数,空出的高位会填充符号位(即补充 0 或 1,取决于符号位)。
cpp
// 示例
int a = 5; // 二进制: 0101
int result = a >> 1; // 结果: 0010,即 2
7. 算术右移与逻辑右移
算术右移:保留符号位,高位补充符号位(负数补充 1,正数补充 0)。
逻辑右移:无论符号,始终将高位补充为 0。
8. 使用场景
位运算通常用于以下场景:
优化性能:位运算通常比算术运算更高效。
权限标志:在操作系统或嵌入式系统中,位运算常用于存储和检查多个状态位或权限
标志。
加密与解密:许多加密算法使用位运算。
二进制数据处理:位运算常用于直接操作二进制数据,如图像处理、压缩算法等。
9. 总结
运算符 | 描述 | 示例 |
---|---|---|
& |
按位与 | a & b |
` | ` | 按位或 |
^ |
按位异或 | a ^ b |
~ |
按位取反 | ~a |
<< |
左移 | a << 1 |
>> |
右移 | a >> 1 |
位运算提供了高效、低级别的运算方式,用于处理二进制数据,广泛应用于系统编程和硬件控制等领域。