C 语言中的位运算符
C 语言中的位运算符允许对存储在计算机内存中的数据进行低级操作。
位运算符与 C 语言中的逻辑运算符不同。例如,逻辑与运算符 (&&) 对两个布尔表达式执行与运算,而位与运算符 (&) 对两个操作数的每个对应位执行与运算。
对于三个逻辑运算符 &&、|| 和 !,C 语言中对应的位运算符分别为 &、| 和 ~。
此外,符号 ^(异或)、<<(左移)和>>(右移)是其他按位运算符。
运算符 | 描述 | 示例 |
---|---|---|
& | 二进制与运算符:如果两个操作数中都存在一位,则将一位复制到结果中。 | (A & B) |
| | 二进制"或"运算符复制一个位,前提是该位存在于任一操作数中。 | (A | B) |
^ | 二进制"异或"运算符复制一个位,前提是该位在一个操作数中被设置,但不是同时存在于两个操作数中。 | (A ^ B) |
~ | 二进制"一的补码"运算符是一元运算符,具有"翻转"位的效果。 | (~A) |
<< | 二进制左移运算符。左侧操作数的值按右侧操作数指定的位数向左移动。 | A << 2 |
>> | 二进制右移运算符。左侧操作数的值按右侧操作数指定的位数向右移动。 | A >> 2 |
尽管这些运算符作用于单个位,但它们只需要 C 数据类型或变量形式的操作数,因为变量在内存中占用特定数量的字节。
C 语言中的按位与运算符 (&)
按位与运算符 (&) 的执行情况如下真值表所示 -
bit a | bit b | a & b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
按位二进制与运算对二进制数字的每个位置上的位执行逻辑运算。
假设两个 int 变量"a"和"b"的值为 60(相当于二进制的 0011 1100)和 13(相当于二进制的 0000 1101),则"a & b"运算的结果为 13,如下所示,按位与运算其对应位。
0011 1100 & 0000 1101 --------- = 0000 1100
二进制数 00001100 对应十进制的 12。
按位或 (|) 运算符
按位或 (|) 运算符的执行结果如下:
bit a | bit b | a | b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
按位二进制或运算对二进制数字的每个位置上的位执行逻辑运算。
假设两个 int 变量"a"和"b"的值为 60(相当于二进制的 0011 1100)和 13(相当于二进制的 0000 1101),则"a | b"的结果为 61,如下所示,按照它们对应位的按位或运算 -
0011 1100 | 0000 1101 --------- = 0011 1101
二进制数 00111101 对应十进制数 61。
按位异或 (^) 运算符
按位异或 (^) 运算符的执行结果符合以下真值表 -
bit a | bit b | a ^ b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
按位二进制异或运算 (XOR) 对二进制数字的每个位置上的位执行逻辑运算。XOR 运算称为"排他或"。
注意:当且仅当其中一个操作数为 1 时,XOR 的结果才为 1。与或运算不同,如果两个位都为 1,则 XOR 的结果为 0。
假设两个 int 变量"a"和"b"的值为 60(相当于二进制的 0011 1100)和 13(相当于二进制的 0000 1101),则根据其对应位的按位异或运算,a ^ b 运算结果为 49,如下所示 -
0011 1100 ^ 0000 1101 --------- = 0011 0001
二进制数 00110001 对应十进制的 49。
左移 (<<) 运算符
左移运算符用符号 << 表示。它将左侧操作数的每一位向左移动右侧操作数指定的位数。移动过程中产生的任何空格都用零填充。
假设 int 变量 "a" 的值为 60(相当于二进制的 0011 1100),则 "a << 2" 运算的结果为 240,具体结果如下所示,其对应位按位左移 −
0011 1100 << 2 = 1111 0000
二进制数 11110000 对应十进制的 240。
右移 (>>) 运算符
右移运算符用符号 >> 表示。它将左侧操作数的每一位向右移动右侧操作数指示的位数。移位过程中产生的任何空格都用零填充。
假设 int 变量 a 的值为 60(相当于二进制的 0011 1100),则"a >> 2"运算的结果为 15,具体操作如下所示,其对应位按位右移 −
0011 1100 >> 2 = 0000 1111
二进制数 00001111 对应十进制的 15。
1 的补码 (~) 运算符
C 语言中的 1 的补码运算符 (~) 是一元运算符,只需要一个操作数。它具有"翻转"位的效果,这意味着 1 被 0 替换,反之亦然。
a | ~a |
---|---|
0 | 1 |
1 | 0 |
假设 int 变量 "a" 的值为 60(相当于二进制的 0011 1100),则 "~a" 运算的结果为二进制补码形式的 -61,具体操作如下:将对应位按位右移 -
~ 0011 1100 = 1100 0011
二进制数 1100 0011 对应十进制的 -61。
示例
在此示例中,我们重点介绍了所有位运算符的运算:
#include <stdio.h> int main(){ unsigned int a = 60; /* 60 = 0011 1100 */ unsigned int b = 13; /* 13 = 0000 1101 */ int c = 0; c = a & b; /* 12 = 0000 1100 */ printf("Line 1 - Value of c is %d ", c ); c = a | b; /* 61 = 0011 1101 */ printf("Line 2 - Value of c is %d ", c ); c = a ^ b; /* 49 = 0011 0001 */ printf("Line 3 - Value of c is %d ", c ); c = ~a; /*-61 = 1100 0011 */ printf("Line 4 - Value of c is %d ", c ); c = a << 2; /* 240 = 1111 0000 */ printf("Line 5 - Value of c is %d ", c ); c = a >> 2; /* 15 = 0000 1111 */ printf("Line 6 - Value of c is %d ", c ); return 0; }
输出
运行此代码时,将产生以下输出 -
Line 1 - Value of c is 12 Line 2 - Value of c is 61 Line 3 - Value of c is 49 Line 4 - Value of c is -61 Line 5 - Value of c is 240 Line 6 - Value of c is 15