C语言中的位运算符

3 阅读3分钟

位运算符是 C 语言里非常底层的操作,它直接对变量的二进制位(0 和 1) 进行运算,而不是对整个数值。可以把它理解成 “按比特位算账”,比普通的加减乘除更贴近计算机的底层工作方式。

1. 核心位运算符(共 6 个)

先给你一张清晰的对照表,再逐个解释:

运算符名称作用(通俗解释)例子(二进制)
&按位与两位都为 1,结果才是 1,否则 01010 & 1100 = 1000
``按位或只要有一位是 1,结果就是 1,否则 0`10101100 = 1110`
^按位异或两位不同(一个 0 一个 1)结果为 1,相同为 01010 ^ 1100 = 0110
~按位取反0 变 1,1 变 0(单目运算符,只有一个操作数)~1010 = 0101(8 位下是补码形式)
<<左移所有位向左移 n 位,右边补 0(相当于 ×2ⁿ)1010 << 1 = 10100
>>右移所有位向右移 n 位,左边补符号位(相当于 ÷2ⁿ)1010 >> 1 = 0101

2. 通俗解释 + 代码示例

用整数(十进制转二进制)来举例,更贴近实际使用:

c

运行

#include <stdio.h>

int main() {
    // 先定义两个数,方便演示
    // 5的二进制:00000101
    int a = 5;
    // 3的二进制:00000011
    int b = 3;

    // 1. 按位与 &:只有对应位都为1,结果才是1
    // 00000101 & 00000011 = 00000001(十进制1)
    printf("a & b = %d\n", a & b);

    // 2. 按位或 |:只要有一个位为1,结果就是1
    // 00000101 | 00000011 = 00000111(十进制7)
    printf("a | b = %d\n", a | b);

    // 3. 按位异或 ^:对应位不同则为1,相同则为0
    // 00000101 ^ 00000011 = 00000110(十进制6)
    printf("a ^ b = %d\n", a ^ b);

    // 4. 按位取反 ~:0变1,1变0(注意:int是有符号数,取反后是补码)
    // ~00000101 = 11111010(十进制-6,因为有符号数最高位是符号位)
    printf("~a = %d\n", ~a);

    // 5. 左移 <<:左移1位,右边补0,相当于乘以2
    // 00000101 << 1 = 00001010(十进制10)
    printf("a << 1 = %d\n", a << 1);

    // 6. 右移 >>:右移1位,左边补符号位(正数补0),相当于除以2
    // 00000101 >> 1 = 00000010(十进制2)
    printf("a >> 1 = %d\n", a >> 1);

    return 0;
}

运行结果:

plaintext

a & b = 1
a | b = 7
a ^ b = 6
~a = -6
a << 1 = 10
a >> 1 = 2

3. 实用场景(新手能理解的)

  • 左移 / 右移:比乘法 / 除法运算更快(计算机底层操作),比如a << 2等价于a * 4
  • 按位与:判断某一位是 0 还是 1(比如判断奇偶:a & 1,结果为 1 是奇数,0 是偶数)。
  • 按位异或:快速交换两个数(不用临时变量),比如a = a ^ b; b = a ^ b; a = a ^ b;
  • 按位取反:底层硬件操作、内存操作中常用,新手暂时了解即可。

总结

  1. 位运算符直接操作二进制位,运算效率极高,是 C 语言贴近底层的体现;
  2. 核心记住:&(都 1 才 1)、|(有 1 就 1)、^(不同则 1)、~(取反)、<<(左移乘 2)、>>(右移除 2);
  3. 有符号数的~>>要注意符号位(正数补 0,负数补 1),新手先聚焦正数的位运算即可。