C语言 - 位运算符

下面是一个关于位运算的教程示例,以 A = 60(二进制 0011 1100)和 B = 13(二进制 0000 1101)为例,详细说明按位与(&)、按位或(|)、异或(^)以及取反(~)的运算规则。

 

1. 按位与(A & B)

规则:对应位都是1时,结果位为1;否则为0。

A:  0 0 1 1 1 1 0 0
B:  0 0 0 0 1 1 0 1
& -----------------
    0 0 0 0 1 1 0 0

结果0000 1100 → 十进制 12

计算过程

  • 第7位:0 & 0 = 0

  • 第6位:0 & 0 = 0

  • 第5位:1 & 0 = 0

  • 第4位:1 & 0 = 0

  • 第3位:1 & 1 = 1

  • 第2位:1 & 1 = 1

  • 第1位:0 & 0 = 0

  • 第0位:0 & 1 = 0


 

2. 按位或(A | B)

规则:对应位至少有一个为1时,结果位为1;否则为0。

A:  0 0 1 1 1 1 0 0
B:  0 0 0 0 1 1 0 1
| -----------------
    0 0 1 1 1 1 0 1

结果0011 1101 → 十进制 61

计算过程

  • 第7位:0 | 0 = 0

  • 第6位:0 | 0 = 0

  • 第5位:1 | 0 = 1

  • 第4位:1 | 0 = 1

  • 第3位:1 | 1 = 1

  • 第2位:1 | 1 = 1

  • 第1位:0 | 0 = 0

  • 第0位:0 | 1 = 1


 

3. 异或(A ^ B)

规则:对应位不同时,结果位为1;相同时为0。

A:  0 0 1 1 1 1 0 0
B:  0 0 0 0 1 1 0 1
^ -----------------
    0 0 1 1 0 0 0 1

结果0011 0001 → 十进制 49

计算过程

  • 第7位:0 ^ 0 = 0

  • 第6位:0 ^ 0 = 0

  • 第5位:1 ^ 0 = 1

  • 第4位:1 ^ 0 = 1

  • 第3位:1 ^ 1 = 0

  • 第2位:1 ^ 1 = 0

  • 第1位:0 ^ 0 = 0

  • 第0位:0 ^ 1 = 1


 

4. 取反(~A)

规则:将每一位取反,0变1,1变0。

重要:取反运算在计算机中会涉及补码表示。对于有符号整数(如C/C++/Java中的int),~A 的结果等于 -A - 1。这里我们先用8位无符号数演示,再说明实际补码行为。

无符号视角(8位)

A:  0 0 1 1 1 1 0 0
~ -----------------
    1 1 0 0 0 0 1 1

结果:1100 0011 → 无符号十进制 195

有符号视角(补码)

在多数编程语言中,整数默认是有符号的。以8位有符号整数为例,最高位是符号位(0正1负)。

  • 0011 1100 = 60(正数)

  • 取反得 1100 0011,这是一个负数的补码表示。
    计算其真值:
    先减1:1100 0011 - 1 = 1100 0010
    再取反(除符号位外):1011 1101 → 十进制 -61

验证公式:~60 = -61 (因为 -60 - 1 = -61

所以在实际编程中,~A 的结果通常是 -61(而不是195),具体取决于数据类型的位数和符号规则。

 

 

posted @ 2026-05-04 15:15  [BORUTO]  阅读(33)  评论(0)    收藏  举报