位运算

位运算直接操作二进制位,是计算机系统中最基础也是最高效的运算形式。

基本运算符

运算符C语言符号含义
&两个位都为1时结果为1
|两个位中至少一个为1时结果为1
~取反:0变1,1变0
异或^两个位不同时结果为1

性质与应用

与运算(&)

  • 掩码操作:x & 0xFF 只保留x的最低8位
  • 清零:x & 0 结果为0
  • 检查特定比特位:x & (1 << k) 用于检查第k位是否为1

或运算(|)

  • 置位:x | (1 << k) 将第k位置为1
  • 合并比特位:将多个标志位合并为一个整数

异或运算(^)

  • 相同为0,不同为1
  • x ^ x = 0x ^ 0 = x
  • 交换律和结合律:(a ^ b) ^ c = a ^ (b ^ c)

取反运算(~)

  • ~x + 1 = -x(补码中,取反加一即为相反数)
  • 掩码生成:~0 得到全1(即-1)

Inplace Swap(不使用临时变量交换两个数)

利用异或的性质,可以在不使用额外变量的情况下交换两个整数的值:

void inplace_swap(int *a, int *b) {
    *a = *a ^ *b;   // a' = a ^ b
    *b = *a ^ *b;   // b' = (a ^ b) ^ b = a
    *a = *a ^ *b;   // a'' = (a ^ b) ^ a = b
}

注意:当 ab 指向同一地址时,此方法会将值清零(因为 *a ^ *a = 0)。

位运算与逻辑运算的区别

C语言中的逻辑运算符 &&||! 与位运算是不同的:

  • 逻辑运算将所有非零值视为true(1),零视为false(0),结果为布尔值
  • 位运算逐位计算,结果为整数
  • 逻辑运算具有短路特性

相关笔记

链接到