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