C 中的位运算符:AND、OR、XOR、移位和补码
什么是位运算符?
位运算符 用于在位级操作数据,也称为位级编程。按位对一个或多个位模式或二进制数字在其各个位的级别上进行操作。它们用于数值计算,使计算过程更快。
以下是“C”编程语言提供的位运算符列表:
操作员 意义 & 按位与运算符| 按位或运算符^ 按位异或运算符~ 二元补码运算符是一元运算符<< 左移运算符>> 右移运算符
位运算符不能直接应用于浮点、双精度等原始数据类型。永远记住一件事,位运算符主要用于整数数据类型,因为它具有兼容性。
按位逻辑运算符逐位处理数据,从最低有效位开始,即最右边的 LSB 位,向最左边的 MSB(Most Significant Bit)工作。
按位逻辑运算符的计算结果如下表所示。
x 是 x &y x |是的 x ^ y 0 00000 10111 00111 1110在本教程中,您将学习-
- 什么是位运算符?
- 按位与
- 按位或
- 按位异或
- 按位移位运算符
- 位补运算符
按位与
这是最常用的逻辑位运算符之一。它由一个 &符号 (&) 表示。在 (&) 运算符的每一侧写入两个整数表达式。
如果两个位的值都为 1,则按位与运算的结果为 1;否则,结果始终为 0。
假设我们有 2 个变量 op1 和 op2,其值如下:
Op1 = 0000 1101 Op2 = 0001 1001
对变量 op1 和 op2 进行 AND 运算的结果将是
Result = 0000 1001
正如我们所看到的,两个变量是逐位比较的。只要两个变量中某个位的值为1,则结果将为1,否则为0。
按位或
它由一个竖线符号 (|) 表示。 (|) 运算符的每一侧写有两个整数表达式。
如果至少有一个表达式的值为 1,则按位或运算的结果为 1;否则,结果始终为 0。
假设我们有 2 个变量 op1 和 op2,其值如下:
Op1 = 0000 1101 Op2 = 0001 1001
对变量 op1 和 op2 进行 OR 运算的结果将是
Result = 0001 1101
正如我们所看到的,两个变量是逐位比较的。每当其中一个变量的位值为 1 时,结果将为 1,否则为 0。
按位异或
它由符号 (^) 表示。 (^) 运算符两边各写了两个整数表达式。
如果只有一个表达式的值为 1,则按位异或运算的结果为 1;否则,结果始终为 0。
假设我们有 2 个变量 op1 和 op2,其值如下:
Op1 = 0000 1101 Op2 = 0001 1001
对变量 op1 和 op2 进行异或运算的结果将是
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
移位运算符
移位运算符用于将位模式移动/移位到左侧或右侧。 left和right是'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”提供的特殊运算符集。
- 它们用于位级编程。
- 这些运算符用于操作整数表达式的位。
- 逻辑、移位和补码是按位运算符的三种类型。
- 按位补码运算符用于反转表达式的位。
C语言