C语言中的位运算符



C语言中的位运算符允许对存储在计算机内存中的数据进行低级操作。

C语言中的位运算符与逻辑运算符形成对比。例如,逻辑与运算符(&&)对两个布尔表达式执行与运算,而位与运算符(&)对两个操作数的每个对应位执行与运算。

对于三个逻辑运算符&&||!,C语言中对应的位运算符分别为&|~

此外,符号^(异或)、<<(左移)和>>(右移)是其他位运算符。

运算符 描述 示例
& 二进制与运算符如果位在两个操作数中都存在,则将其复制到结果中。 (A & B)
| 二进制或运算符如果位在任一操作数中存在,则将其复制。 (A | B)
^ 二进制异或运算符如果位在一个操作数中设置,但在另一个操作数中没有设置,则将其复制。 (A ^ B)
~ 二进制一补码运算符是一元运算符,其作用是“翻转”位。 (~A
<< 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 A << 2
>> 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 A >> 2

尽管这些运算符作用于单个位,但它们需要操作数以C数据类型或变量的形式出现,因为变量在内存中占用特定数量的字节。

C语言中的位与运算符 (&)

位与 (&) 运算符根据以下真值表执行操作:

位 a 位 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。

位或 (|) 运算符

位或 (|) 运算符根据以下真值表执行操作:

位 a 位 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。

位异或 (^) 运算符

位异或 (^) 运算符根据以下真值表执行操作:

位 a 位 b a ^ b
0 0 0
0 1 1
1 0 1
1 1 0

位二进制异或对数字在其二进制形式中每个位置的位执行逻辑运算。异或运算称为“互斥或”。

注意:仅当一个操作数为1时,异或的结果才为1。与或不同,如果两个位都为1,则异或的结果为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。

一补码 (~) 运算符

C语言中的一补码运算符 (~) 是一元运算符,只需要一个操作数。它具有“翻转”位的作用,这意味着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\n", c );

   c = a | b;       /* 61 = 0011 1101 */
   printf("Line 2 - Value of c is %d\n", c );

   c = a ^ b;       /* 49 = 0011 0001 */
   printf("Line 3 - Value of c is %d\n", c );

   c = ~a;          /*-61 = 1100 0011 */
   printf("Line 4 - Value of c is %d\n", c );

   c = a << 2;     /* 240 = 1111 0000 */
   printf("Line 5 - Value of c is %d\n", c );

   c = a >> 2;     /* 15 = 0000 1111 */
   printf("Line 6 - Value of c is %d\n", 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
c_operators.htm
广告