一、按位或的概念
按位或运算符为 |,它将两个操作数对应的二进制位的每一位一一对应,并进行逻辑或运算。
运算规则:两个对应位只要有一个为 1,结果位就为 1;只有两个位都为 0 时,结果位才为 0。
| 位a | 位b | a | b |
|---|---|---|---|
| 0 | 0 | 0 | |
| 0 | 1 | 1 | |
| 1 | 0 | 1 | |
| 1 | 1 | 1 |
二、按位或的常见用途
将操作数中的若干位置一(其他位不变)
利用 1 | x = 1 的特性,将需要置一的位与 1 进行按位或,需要保留的位与 0 进行按位或。
示例:将 int 类型变量 a 的低字节(低 8 位)全部置一,其余位保持不变。
a = a | 0xff;
分析:0xff 的二进制为低 8 位全 1(00000000 00000000 00000000 11111111)。a 与 0xff 按位或后,低 8 位被强制置一,其余位保持原值不变。
三、代码示例
以下代码演示了按位或运算的实际应用:
#include <iostream>
using namespace std;
int main()
{
// 示例1:将低字节置一
int a = 0x12345600;
a = a | 0xff;
cout << "a after set low byte: " << hex << a << endl;
// 结果:123456ff
// 示例2:将指定位置一(第3位置一,从0开始计数)
unsigned char flags = 0x00; // 00000000
flags = flags | (1 << 3); // 1 << 3 = 00001000
cout << "flags after set bit 3: " << hex << (int)flags << endl;
// 结果:08
// 示例3:同时置多个位
unsigned char status = 0x10; // 00010000
status = status | 0x05; // 0x05 = 00000101
cout << "status after set bits: " << hex << (int)status << endl;
// 00010000 | 00000101 = 00010101,十六进制 15
// 示例4:组合两个字节
unsigned char high = 0xAB;
unsigned char low = 0xCD;
int combined = (high << 8) | low;
cout << "combined: " << hex << combined << endl;
// 结果:abcd
// 示例5:复合赋值运算符
int x = 0x10;
x |= 0x01;
cout << "x after |= 0x01: " << hex << x << endl;
// 结果:11
return 0;
}Code language: PHP (php)
四、注意事项
- 按位或 | 不要与逻辑或 || 混淆。| 是对每一位进行运算,|| 是对整体布尔值进行运算。
- 将位置一时,掩码中需要置一的位设为 1,需要保留的位设为 0。
- 按位或常用于将多个标志位组合成一个整数,或从硬件寄存器中设置控制位。
五、小结
- 按位或(|)将两个操作数逐位进行逻辑或运算。
- 主要用途:将指定位置一、合并标志位、组合数据。
- 置一操作:目标位与 1 按位或,其余位与 0 按位或。
- 与按位与配合使用时,可实现精确的指定位控制(先与后或)。