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),具体取决于数据类型的位数和符号规则。

浙公网安备 33010602011771号