C++位运算

​

 C++ 位运算

在C++中,位运算是直接对二进制位进行操作的运算,其操作数通常是整型或枚举类型。位运算速度极快,常用于底层编程、数据压缩、加密算法和性能优化等场景。以下是对C++位运算的详细总结:

基础位运算符

  1. 按位与(&)
    两个对应位都为1时,结果位为1,否则为0。

  2. 按位或(|)
    两个对应位中有一个为1,结果位为1;只有当两个位都为0时,结果位为0。

  3. 按位异或(^)
    两个对应位不同时,结果位为1;相同时,结果位为0。

  4. 按位取反(~)
    对操作数的每一位取反(1变0,0变1)。

  5. 左移(<<)
    将左操作数的二进制位向左移动右操作数指定的位数,右边空出的位用0填充。

  6. 右移(>>)
    将左操作数的二进制位向右移动右操作数指定的位数。对于无符号数,左边空出的位用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

交换两个变量的值

不使用临时变量交换两个变量的值:

a ^= b;
b ^= a;
a ^= b;

高效计算

  • 乘以 / 除以 2 的幂:x << n 等价于 x * (2^n),x >> n 等价于 x / (2^n)。
  • 判断奇偶性:x & 1 结果为 1 时 x 是奇数,结果为 0 时 x 是偶数。
  • 计算绝对值:
    int abs(int x) {
        int mask = x >> 31;
        return (x ^ mask) - mask;
    }
    

枚举标志

使用位运算组合枚举值:

enum Flags {
    READ = 1,    // 0001
    WRITE = 2,   // 0010
    EXECUTE = 4  // 0100
};
int permissions = READ | WRITE; // 0011

高级技巧

计算汉明权重(二进制中 1 的个数)

int countBits(int x) {
    int count = 0;
    while (x) {
        count += x & 1;
        x >>= 1;
    }
    return count;
}

// 更高效的方法
int countBits(int x) {
    int count = 0;
    while (x) {
        x &= x - 1; // 清除最低位的1
        count++;
    }
    return count;
}

判断是否是 2 的幂

若 x & (x - 1) == 0,则 x 是 2 的幂。

查找最低位的 1

x & -x 返回最低位 1 所在位置对应的数值。

位操作实现加法

int add(int a, int b) {
    while (b != 0) {
        int carry = a & b;
        a = a ^ b;
        b = carry << 1;
    }
    return a;
}

注意事项

  1. 优先级问题
    位运算符的优先级低于算术运算符,使用时需注意添加括号,例如 (x & 0xFF)。

  2. 有符号数右移
    有符号数右移执行算术右移(保留符号位),可能导致意外结果。

  3. 性能考量
    现代编译器通常会优化简单的位运算,在性能关键代码中优先使用位运算而非函数调用。

  4. 可移植性
    不同平台对某些位操作的实现可能不同,例如移位位数超过类型宽度的行为是未定义的。

示例代码

以下是一个完整示例,展示位运算的常见用法:

#include <iostream>
using namespace std;

int main() {
    // 基础操作
    int a = 5;  // 二进制: 0101
    int b = 3;  // 二进制: 0011

    cout << "a & b = " << (a & b) << endl;  // 输出 1 (0001)
    cout << "a | b = " << (a | b) << endl;  // 输出 7 (0111)
    cout << "a ^ b = " << (a ^ b) << endl;  // 输出 6 (0110)
    cout << "~a = " << (~a) << endl;        // 输出 -6 (二进制补码)
    cout << "a << 1 = " << (a << 1) << endl; // 输出 10 (1010)
    cout << "a >> 1 = " << (a >> 1) << endl; // 输出 2 (0010)

    // 位操作技巧
    int x = 13;  // 二进制: 1101
    cout << "第2位是否为1: " << ((x & (1 << 2)) ? "是" : "否") << endl;
    cout << "设置第1位为1: " << (x | (1 << 1)) << endl;
    cout << "清除第3位: " << (x & ~(1 << 3)) << endl;
    cout << "切换第0位: " << (x ^ (1 << 0)) << endl;

    return 0;
}

位运算在 C++ 中应用广泛,但需深入理解二进制表示和补码运算才能正确使用。在底层编程或性能优化时,位运算是强大的工具。

​
posted @ 2025-09-06 15:35  一只小小的芙厨  阅读(270)  评论(0)    收藏  举报