C 语言位运算符:AND、OR、XOR、移位与补码

什么是位运算符?

位运算符用于在位级别操作数据,也称为位级编程。位运算符对一个或多个位模式或二进制数进行操作,作用于它们的各个位。它们用于数值计算,以加快计算过程。

以下是“C”编程语言提供的位运算符列表

运算符 含义
& 按位与运算符
| 按位或运算符
^ 按位异或运算符
~ 二进制一补码运算符是一元运算符
<< 左移运算符
>> 右移运算符

位运算符不能直接应用于浮点型、双精度型等基本数据类型。始终记住一点,位运算符主要与整数数据类型一起使用,因为它们具有兼容性。

位逻辑运算符按位操作数据,从最低有效位(LSB,即最右边的位)开始,向最高有效位(MSB,即最左边的位)进行操作。

位逻辑运算符的计算结果显示在下表中。

x ÿ x & y x | y x ^ y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

按位与

这是最常用的逻辑位运算符之一。它用单个“与”号(&)表示。在“与”运算符的两边分别写上两个整数表达式。
当两个位都为 1 时,按位与操作的结果为 1;否则,结果始终为 0。

假设我们有两个变量 op1 和 op2,其值如下

Op1 = 0000 1101
Op2 = 0001 1001

变量 op1 和 op2 的 AND 操作结果将是

Result = 0000 1001

正如我们所见,两个变量是逐位比较的。当两个变量中的一个位的值都为 1 时,结果为 1,否则为 0。

按位或

它用单个竖线(|)表示。在“或”运算符的两边分别写上两个整数表达式。

当至少有一个表达式的值为 1 时,按位或操作的结果为 1;否则,结果始终为 0。

假设我们有两个变量 op1 和 op2,其值如下

Op1 = 0000 1101
Op2 = 0001 1001

变量 op1 和 op2 的 OR 操作结果将是

Result = 0001 1101

正如我们所见,两个变量是逐位比较的。当其中一个变量中的一个位的值为 1 时,结果将为 1,否则为 0。

按位异或

它用符号(^)表示。在“异或”运算符的两边分别写上两个整数表达式。

当仅有一个表达式的值为 1 时,按位异或操作的结果为 1;否则,结果始终为 0。

假设我们有两个变量 op1 和 op2,其值如下

Op1 = 0000 1101
Op2 = 0001 1001

变量 op1 和 op2 的 XOR 操作结果将是

Result = 0001 0100

正如我们所见,两个变量是逐位比较的。当只有一个变量的值为 1 时,结果为 0,否则结果为 0。

让我们编写一个简单的程序来演示逻辑位运算符。

#include <stdio.h>
int main() 
{
int a = 20;	/* 20 = 010100 */  
int b = 21;	/* 21 = 010101 */
int c = 0;           

c = a & b;       /* 20 = 010100 */ 
printf("AND - Value of c is %d\n", c );

c = a | b;       /* 21 = 010101 */
printf("OR - Value of c is %d\n", c );

c = a ^ b;       /* 1 = 0001 */
printf("Exclusive-OR - Value of c is %d\n", c );

getch();
}

输出

AND - Value of c is 20
OR - Value of c is 21
Exclusive-OR - Value of c is 1

按位移位运算符

按位移位运算符用于将位模式向左或向右移动/移位。“C”提供了左移和右移两种移位运算符,表示如下:

Operand << n (Left Shift)
Operand >> n (Right Shift)

此处,

  • 操作数是一个整数表达式,我们要在其上执行移位操作。
  • “n”是我们要在整数表达式中移位的位数。

左移操作会将“n”个位向左移动。表达式中最左边的位将被弹出,右侧将填充 n 个值为 0 的位。

右移操作会将“n”个位向右移动。表达式中最右边的“n”个位将被弹出,左侧将填充值为 0 的位。

示例:x 是一个数据为 1111 的整数表达式。执行移位操作后的结果将是

x << 2 (left shift) = 1111<<2 = 1100
x>>2 (right shift) = 1111>>2 = 0011

移位运算符可以组合使用,用于从整数表达式中提取数据。让我们编写一个程序来演示按位移位运算符的用法。

#include <stdio.h>
int main() {
int a = 20;	/* 20 = 010100 */  
int c = 0;           

c = a << 2;	/* 80 = 101000 */
printf("Left shift - Value of c is %d\n", c );

c = a >> 2;	/*05 = 000101 */
printf("Right shift - Value of c is %d\n", c );
return 0;
}

输出

Left shift - Value of c is 80
Right shift - Value of c is 5

执行左移操作后,值将变为 80,其二进制等效值为 101000。

执行右移操作后,值将变为 5,其二进制等效值为 000101。

按位补码运算符

按位补码也称为一补码运算符,因为它总是只取一个值或操作数。它是一个一元运算符。

当我们对任何位执行补码时,所有的 1 都会变成 0,反之亦然。

如果我们有一个整数表达式,其中包含 0000 1111,则执行按位补码操作后的值将变为 1111 0000。

按位补码运算符由波浪线(~)符号表示。

让我们编写一个演示按位补码运算符实现的程序。

#include <stdio.h>
int main() {
int a = 10;	/* 10 = 1010 */  
int c = 0;           
c = ~(a);      
printf("Complement - Value of c is %d\n", c );
return 0;
}

输出

Complement - Value of c is -11

这里是另一个程序,其中包含前面讨论过的所有运算符的示例

#include <stdio.h>
main() {
unsigned int x = 48;	/* 48 = 0011 0000 */  
unsigned int y = 13;	/* 13 = 0000 1101 */
int z = 0;           

z =x & y;       /* 0 = 0000 0000 */ 
printf("Bitwise AND Operator - x & y = %d\n", z );

z = x | y;       /* 61 = 0011 1101 */
printf("Bitwise OR Operator - x | y = %d\n", z );

z= x^y;       /* 61 = 0011 1101 */
printf("Bitwise XOR Operator- x^y= %d\n", z);

z = ~x;          /*-49 = 11001111 */
printf("Bitwise One's Complement Operator - ~x = %d\n", z);

z = x << 2;     /* 192 = 1100 0000 */
printf("Bitwise Left Shift Operator x << 2= %d\n", z );

z= x >> 2;     /* 12 = 0000 1100 */
printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}

编译并运行程序后,它会产生以下结果

Bitwise AND Operator - x & y = 0
Bitwise OR Operator - x | y = 61
Bitwise XOR Operator- x^y= 61
Bitwise One's Complement Operator - ~x = -49
Bitwise Left Shift Operator x << 2= 192
Bitwise Right Shift Operator x >> 2= 12

摘要

  • 按位运算符是“C”提供的一组特殊运算符。
  • 它们用于位级编程。
  • 这些运算符用于操作整数表达式的位。
  • 逻辑、移位和补码是三种类型的位运算符。
  • 按位补码运算符用于反转表达式的位。