Cprogramming 简明教程

Bitwise Operators in C

C 语言中的按位运算符允许对存储在计算机内存中的数据的底层运算。

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

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

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

Operator

Description

Example

&

二进制与运算符将位复制到结果中(如果它存在于两个操作数中)。

(A & B)

二进制 OR 运算符会在任一操作数中存在的情况下复制比特。

(A

B)

^

二进制 XOR 运算符会在其中一个操作数中但不在两个操作数中都设置的情况下复制比特。

(A ^ B)

~

二进制一元补码运算符是一元运算符,其作用是“翻转”位。

(~A

<<

二进制左移运算符。左操作数的值会向左移动由右操作数指定的比特数。

A << 2

>>

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

Bitwise AND Operator (&) in C

按位 AND (&) 运算符根据以下真值表执行操作 −

bit

bit

a & b

0

0

0

0

1

0

1

0

0

1

1

1

按位二进制 AND 对二进制形式的数字中每个位置的位执行逻辑运算。

假设两个 int 变量“a”和“b”的值为 60(相当于二进制中的 0011 1100)和 13(相当于二进制中的 0000 1101),则“a & b”运算会产生 13,按照如下所示的对应位的按位 AND。

  0011 1100
& 0000 1101
  ---------
= 0000 1100

二进制数 00001100 等于十进制中的 12。

Bitwise OR (|) Operator

按位 OR(|)运算符按照以下真值表执行 −

bit

bit

a

b

0

0

0

0

1

1

1

0

1

1

1

1

按位二进制 OR 在一个数的二进制形式中,对每个位置里的位执行逻辑运算。

假设两个 int 变量“a”和“b”的值分别是 60(等于二进制中的 0011 1100)和 13(等于二进制中的 0000 1101),则“ a | b ”的结果为 61,按其对应位的按位 OR 所得,如下所示 −

  0011 1100
| 0000 1101
  ---------
= 0011 1101

二进制数 00111101 等于十进制中的 61。

Bitwise XOR (^) Operator

按位 XOR(^)运算符按照以下真值表执行 −

bit

bit

a ^ b

0

0

0

0

1

1

1

0

1

1

1

0

按位二进制 XOR 在一个数的二进制形式中,对每个位置里的位执行逻辑运算。XOR 运算称为“异或”。

Note: 只有当其中一个运算元为 1 时,XOR 的结果才为 1。与 OR 不同,如果两个位都是 1,则 XOR 的结果为 0。

假设两个 int 变量“a”和“b”的值分别是 60(等于二进制中的 0011 1100)和 13(等于二进制中的 0000 1101),则“ a ^ b ”运算的结果为 49,按其对应位的按位 XOR 所得,如下所示 −

  0011 1100
^ 0000 1101
  ---------
= 0011 0001

二进制数 00110001 等于十进制中的 49。

The Left Shift (<<) Operator

左移运算符由 << 符号表示。它按照右操作数指定的位数,将其左操作数中的每个位向左移动。移动时产生的任何空白由零填充。

假设 int 变量“a”的值为 60(等于二进制中的 0011 1100),则“ a << 2 ”运算的结果为 240,按其对应位的按位左移所得,如下所示 −

0011 1100 << 2 = 1111 0000

二进制数 11110000 等于十进制中的 240。

The Right Shift (>>) Operator

右移运算符由 >> 符号表示。它按照右操作数指定的位数,将其左操作数中的每个位向右移动。移动时产生的任何空白由零填充。

假设 int 变量 a 的值为 60(等于二进制中的 0011 1100),则“ a >> 2 ”运算的结果为 15,按其对应位的按位右移所得,如下所示 −

0011 1100 >> 2 = 0000 1111

二进制数 00001111 等于十进制中的 15。

The 1’s Complement (~) Operator

C 中的 1 的补运算符 (~) 是一元运算符,只接受一个操作元。其作用是“翻转”位,这意味着 1 由 0 代替,反之亦然。

a

~a

0

1

1

0

假设 int 变量“a”的值为 60(等于二进制中的 0011 1100),则“ ~a ”运算的结果为 2 的补码形式中的 -61,按其对应位的按位右移所得,如下所示 −

~ 0011 1100 = 1100 0011

二进制数 1100 0011 等于十进制中的 -61。

Example

在本例中,我们强调了所有按位运算符的操作:

#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