【编程】C++入门:位运算(&、|、^、~、>>、<<)
发布日期:2021-05-12 12:42:15 浏览次数:17 分类:精选文章

本文共 1718 字,大约阅读时间需要 5 分钟。

位运算符及移位操作

1. 按位与运算符(&)

运算规则

按位与运算的规则很简单:两个数在同一二进制位上都为1时,结果为1;否则,结果为0。

对于负数来说,按位与运算需要用补码形式进行计算。这意味着在处理负数时,需要额外考虑二进制数的符号位。

运算用途

  • 清零

    想将一个数的某些位清零,可以通过与一个掩码进行按位与运算。例如,用掩码0x00001111与数0x12345678进行按位与运算,可以得到清零后的低24位结果0x00004678

  • 提取指定位

    想只保留一个数的某些位,可以通过设计一个掩码(所有需要保留的位为1,其余为0)。例如,想提取一个数X的低4位,可以使用掩码0x00001111进行按位与运算,得到结果X & 0x00001111

  • 判断奇偶性

    通过按位与1的结果来判断奇偶性。例如,判断一个数a是否为偶数,只需检查a & 1是否为0:

    if ((a & 1) == 0) {  
    // 代表a是偶数
    }

  • 2. 按位或运算符(|)

    运算规则

    按位或运算的规则是:只要两个数中至少有一个为1,结果为1;否则,结果为0。

    同样,负数按位或运算也使用补码形式。这意味着在处理负数时,符号位的变化会影响结果。

    运算用途

  • 设置指定位

    想将一个数的某些位设置为1,可以通过设计一个掩码(所有需要设置的位为1,其余为0)。例如,想将数X的低4位设置为1,可以使用掩码0x00001111进行按位或运算,得到结果X | 0x00001111

  • 拓展二进制数

    通过按位或运算可以简单地增加二进制数的位数。例如,一个8位数0xFF0x00进行按位或运算,结果仍然是0xFF

  • 处理符号位

    在有符号数中,按位或运算可以用来改变数字的符号。例如,一个负数-123(补码形式下为11111111 11111111 11111101)与0x80000000(负数表示为10000000 00000000 00000000)进行按位或运算,可以将原数的负号扩展到高位,得到-32767


  • 3. 异或运算符(^)

    运算规则

    异或运算的规则是:两个数在同一二进制位上都为0,结果为0;都为1,结果为1;一方为1另一方为0,结果为1。

    异或运算的计算方式类似于“异或”电路,两个输入信号不同则输出信号为1。

    运算用途

  • 翻转指定位

    想将一个数的某个位从0翻转为1(或1翻转为0),可以使用异或运算。例如,将X = 0xA(二进制1010)与0xA异或,结果为0x0(二进制0000)。
    Want to flip a specific bit from 0 to 1 or 1 to 0:
    例如,想翻转X = 0xA(二进制1010)的最低位,可以使用异或操作:

    X = X ^ 1
  • 与0异或不变

    当一个数与0异或时,结果不变。例如:

    0b1010 ^ 0b0000 = 0b1010
  • 交换两个数

    想交换两个数的值,可以利用异或运算。例如,实现一个简单的交换函数:

    void Swap(int a, int b) {  
    if (a != b) {
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    }

  • 4. 左移运算符(<<)

    左移运算符<<用于将一个整数的二进制位向左移动指定的位数。在左移时,丢弃被移出的最高位,并在最低位补充与原数值无关的新的0。

    示例

    • 5 << 2(二进制101左移两位):
      丢弃左移前的最高位1,结果变为1010(即10)。
    • -5 << 2
      如果是有符号数,左移时最高位会被原符号位(1)填充。
      二进制...11111011左移两位后变为...111110110

    5. 右移运算符(>>>)

    右移运算符>>>用于将一个整数的二进制位向右移动指定的位数。在右移时,丢弃被移出的最低位,并根据是否是有符号数填充移出的最高位。

    示例

    • 5 >> 2(二进制101右移两位):
      丢弃最低位1,结果变为101(即2)。
    • -5 >> 2
      如果是有符号数,右移时填充最高位的0
      二进制...11111011右移两位后变为...00000111
    上一篇:【编程】C++入门:如何判断两个浮点数是否相等
    下一篇:【刷题】P94剑指offer:动态规划与贪婪算法:面试题14:剪绳子

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月21日 08时24分45秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章