位运算实战

位运算符

运算符名称运算规则记忆口诀
&按位与两个二进制位都为1时结果为1,否则为0全1出1,有0出0
|按位或两个二进制位都为0时结果为0,否则为1有1出1,全0出0
^按位异或两个二进制位相同时结果为0,不同时结果为1相同为0,不同为1
~按位取反单目运算符,0变1,1变0(包含符号位全部翻转
<<左移高位丢弃,低位补02n2n
>>右移低位丢弃,高位补符号位(算术右移)2n2n(向下取整)

规则与运算

按位与(&):清零与截取

核心性质

  • x & 1:取x的最低位(判断奇偶)
  • x & (~0 << n):将低n位清零(右侧低位左侧高位)
  • 与0运算:x & 0 = 0

按位或(|):置1操作

核心性质

  • x | (1 << n):将第n位设为1
  • 或0不改变:x | 0 = x

按位异或(^):不进位加法与交换

核心性质(高频考点):

  • x ^ x = 0(自身异或得0)
  • x ^ 0 = x(与0异或不变)
  • x ^ y ^ x = y(自反性)
  • 异或满足交换律和结合律

交换算法

    // 临时变量交换
    int temp = a;
    a = b;
    b = temp;

    // 异或交换(三步异或,只适用整数)
    a = a ^ b;  // 第一步:a = a ^ b
    b = a ^ b;  // 第二步:b = (a ^ b) ^ b = a
    a = a ^ b;  // 第三步:a = (a ^ b) ^ a = b

    // 加减法交换(可能有溢出风险)
    a = a + b;  // 第一步:a = a + b
    b = a - b;  // 第二步:b = (a+b) - b = a
    a = a - b;  // 第三步:a = (a+b) - a = b

左移(<<)与右移(>>):乘除2的幂

左移规则

  • x << n = x×2n
  • 高位丢弃,低位补0
  • 可能改变符号位(溢出)

右移规则(重点!)

  • 正数右移:高位补0(逻辑右移)
  • 负数右移:高位补1(算术右移,保持符号位)
  • x >> n = x÷2n(向下取整)

常用公式及用法

恒等式

操作结果应用场景
x & xx
x | xx
x ^ x0判断相等、去重
x & 00清零
x | 0x
x ^ 0x
x & 1x的最低位判断奇偶
x << nx×2n快速乘
x >> nx÷2n快速除

判断奇偶

if (a & 1) {
    // a是奇数
} else {
    // a是偶数
}

判断相等

if ((a ^ b) == 0) {
    // a == b
}

运算符优先级

从高到低:

  1. ~(取反)—— 同!++等单目运算符
  2. <<>>(移位)—— 比加减法低
  3. &(与)
  4. ^(异或)
  5. |(或)
  6. &=^=|=<<=>>=(复合赋值)

常见陷阱

陷阱错误写法正确写法
优先级混淆x & 3 == 1(x & 3) == 1
负数的右移误以为负数右移补0负数右移补1(算术右移)
对有符号数左移溢出int << 31可能变成负数注意范围
取反符号位以为~不影响符号位~所有位取反,包括符号位