按位 OperaC 语言中的运算符:AND、OR、XOR、 Shift & 补充

什么是按位 Opera托尔斯?

按位 Opera职权范围 用于在位级别上操作数据,也称为位级编程。按位操作在单个位级别上对一个或多个位模式或二进制数字进行操作。它们用于数值计算,以加快计算过程。

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

Opera器
& 按位与运算符
| 按位或运算符
^ 按位排他或运算符
~ 二进制补码 Operator 是一元运算符
<< 左移运算符
>> 右移运算符

按位运算符不能直接应用于原始数据类型,例如 float、double 等。请始终记住一件事,按位运算符主要用于整数数据类型,因为它具有兼容性。

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

按位逻辑运算符的计算结果如下表所示。

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。

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

Op1 = 0000 1101
Op2 = 0001 1001

对变量 op1 和 op2 进行 AND 运算的结果为

Result = 0000 1001

我们可以看到,两个变量是逐位比较的。只要两个变量中某个位的值都是 1,则结果为 1,否则为 0。

按位或

它用一个竖线符号 (|) 表示。(|) 运算符的两边各写两个整数表达式。

如果表达式中至少有一个值为 1,则按位或运算的结果为 1;否则,结果始终为 0。

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

Op1 = 0000 1101
Op2 = 0001 1001

对变量 op1 和 op2 进行或运算的结果为

Result = 0001 1101

我们可以看到,两个变量是逐位比较的。只要其中一个变量中某个位的值为 1,则结果为 1,否则为 0。

按位异或

它用符号(^)表示。(^)运算符两边各写两个整数表达式。

按位排他或运算的结果,只要表达式中只有一个值为 1,则为 1;否则,结果始终为 0。

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

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

按位移位运算符

按位移位运算符用于将位模式向左或向右移动/移位。左和右是 ' 提供的两个移位运算符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

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

#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 的补码”运算符,因为它始终只接受一个值或一个操作数。它是一个一元运算符。

当我们对任何位执行补码时,所有的 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”提供的特殊运算符集。
  • 它们用于位级编程。
  • 这些运算符用于操作整数表达式的位。
  • 逻辑、移位和补码是三种类型的位运算符。
  • 按位补码运算符用于反转表达式的位。