Files
e2hang 265b8af720 IDS
2025-09-11 15:53:33 +08:00

3.4 KiB
Raw Permalink Blame History

好嘞 👍 你问到的 C++ 位运算符,其实是底层操作里最常用的一类。它们直接对整数的二进制位进行操作,比算术运算更接近硬件。


🔑 C++ 位运算符总览

运算符 名称 含义 示例(假设 a = 6 (0110₂), b = 11 (1011₂) 结果
& 按位与 (AND) 对应位都为 1 才为 1 a & b = 0010₂ 2
| 按位或 (OR) 对应位至少一个为 1 就为 1 `a b = 1111₂` 15
^ 按位异或 (XOR) 对应位相同为 0不同为 1 a ^ b = 1101₂ 13
~ 按位取反 (NOT) 0 变 11 变 0 ~a = ...11111001₂ -7补码表示
<< 左移 所有二进制位向左移,右边补 0 a << 1 = 1100₂ 12
>> 右移 所有二进制位向右移,左边补符号位(算术右移)或 0逻辑右移C++ 对有符号数实现依赖编译器) a >> 1 = 0011₂ 3

📘 详细解释

1. 按位与 &

常用来 取某些位

int x = 13;        // 1101₂
int mask = 4;      // 0100₂
if (x & mask) cout << "第3位是1" << endl; // 输出 第3位是1

2. 按位或 |

常用来 设置某些位为 1

int x = 5;         // 0101₂
int mask = 2;      // 0010₂
x = x | mask;      // 0111₂ -> 7

3. 按位异或 ^

  • 不同为 1相同为 0。
  • 特性:a ^ a = 0a ^ 0 = a
  • 常用于 交换变量求对称差
int a = 5, b = 9;
a = a ^ b;
b = a ^ b;
a = a ^ b;
cout << a << " " << b << endl; // 输出 9 5

4. 按位取反 ~

逐位取反。注意负数结果与补码有关:

int a = 6; // 0000...0110
cout << ~a << endl; // -7

5. 左移 <<

相当于乘以 $2^n$(但可能溢出):

int a = 3;  // 0011₂
cout << (a << 2) << endl; // 1100₂ = 12

6. 右移 >>

相当于整除 $2^n$(但要区分有符号/无符号):

int a = 12; // 1100₂
cout << (a >> 2) << endl; // 0011₂ = 3

补充:常见用途

  1. 快速运算x << 1 相当于 x * 2x >> 1 相当于 x / 2
  2. 掩码操作:取某些位、清零某些位、设置某些位。
  3. 集合表示:一个整数的二进制位可以看作集合的元素是否存在。
  4. 加密/压缩:异或在流密码、校验和算法里很常见。

总结

  • C++ 提供了 & | ^ ~ << >> 六个主要位运算符。
  • 它们直接操作二进制位,速度快、常用于底层优化。
  • 常见技巧:掩码操作、快速乘除、集合运算、加密。

要不要我帮你写一个 完整的小程序,输入两个整数,输出它们的二进制表示,以及 & | ^ ~ << >> 的运算结果?这样能直观看清效果。