按位或

一、按位或的概念

按位或运算符为 |,它将两个操作数对应的二进制位的每一位一一对应,并进行逻辑或运算。

运算规则:两个对应位只要有一个为 1,结果位就为 1;只有两个位都为 0 时,结果位才为 0。

位a位bab
000
011
101
111

二、按位或的常见用途

将操作数中的若干位置一(其他位不变)

利用 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 按位或。
  • 与按位与配合使用时,可实现精确的指定位控制(先与后或)。
Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注