学习C – C位运算符
位运算符对整数值的位进行操作。
有六个位运算符,如下表所示。
操作符 | 描述 |
---|---|
& | 按位与运算符 |
| | 按位或运算符 |
^ | 按位异或运算符 |
~ | 按位取反运算符,也称为1的补码运算符 |
>> | 按位右移运算符 |
<< | 按位左移运算符 |
所有这些仅对整数类型进行操作。
〜
运算符是一元运算符 – 它适用于一个操作数 – 其他是二元运算符。
位与
按位与运算符&
,以这样的方式组合其操作数的相应位,如果两个位都为1,则结果位为1;否则,结果位为0。
假设你声明以下变量:
int x = 13; int y = 6; int z = x & y; // AND corresponding bits of x and y
在第三个语句之后,z将具有值4(二进制100)。
这是因为x和y中的相应位组合如下:
x 0 0 0 0 1 1 0 1 y 0 0 0 0 0 1 1 0 x & y 0 0 0 0 0 1 0 0
例子
#include <stdio.h>
int main(void)
{
int x = 13;
int y = 6;
int z = x & y; // AND corresponding bits of x and y
printf("\n original = %X", x);
printf("\n original = %X", y);
printf("\t result = %X\n", z);
return 0;
}
上面的代码生成以下结果。
位或
按位或运算符 |
,如果相应位中的一个或两个位为1,则导致1;否则,结果为0。
如果使用|组合相同的x和y值运算符在这样的声明中:
int x = 13; int y = 6; int z = x | y; // OR the bits of x and y x 0 0 0 0 1 1 0 1 y 0 0 0 0 0 1 1 0 x | y 0 0 0 0 1 1 1 1
因此,存储在z中的值为15(二进制1111)。
例子
#include <stdio.h>
int main(void)
{
int x = 13;
int y = 6;
int z = x | y; // OR the bits of x and y
printf("\n original = %X", x);
printf("\n original = %X", y);
printf("\t result = %X\n", z);
return 0;
}
上面的代码生成以下结果。
位异或
按位异或运算符 ^
,如果两个位都不同,则产生1,如果它们相同,则产生0。
int x = 13; int y = 6; int z = x ^ y; // Exclusive OR the bits of x and y <myPreCode> <p>This results in z containing the value 11 (binary 1011), because the bits combine as follows: </p> <myPreCode> x 0 0 0 0 1 1 0 1 y 0 0 0 0 0 1 1 0 x ^ y 0 0 0 0 1 0 1 1
例子
#include <stdio.h>
int main(void)
{
int x = 13;
int y = 6;
int z = x ^ y; // Exclusive OR the bits of x and y
printf("\n original = %X", x);
printf("\n original = %X", y);
printf("\t result = %X\n", z);
return 0;
}
上面的代码生成以下结果。
位翻转
一元运算符〜
翻转其操作数的位,所以1变为0,0变为1。
int x = 13; int z = ~x; // Store 1"s complement of x
执行此语句后,z将具有值14.位设置如下:
x 0 0 0 0 1 1 0 1 ~x 1 1 1 1 0 0 1 0
值1111 0010是负整数的二进制补码表示中的14。
例子
#include <stdio.h>
int main(void)
{
int x = 13;
int z = ~x; // Store 1"s complement of x
printf("\n original = %X", x);
printf("\t result = %X\n", z);
return 0;
}
上面的代码生成以下结果。
位左移
移位操作符将左操作数中的位移动由右操作数指定的位数。
您可以使用以下语句指定左移操作:
int value = 12; int shiftcount = 3; // Number of positions to be shifted int result = value << shiftcount; // Shift left shiftcount positions
这些位移动到左侧三个位置,在右侧引入0。
例子
#include <stdio.h>
int main(void)
{
int value = 12;
int shiftcount = 3; // Number of positions to be shifted
int result = value << shiftcount; // Shift left shiftcount positions
printf("\t result = %X\n", result);
return 0;
}
上面的代码生成以下结果。
无符号右移
右移位操作符将位向右移动。对于无符号值,左侧引入的位用零填充。
unsigned int value = 65372U; unsigned int result = value >> 2; // Shift right two bits
值的位将向右移动两个位置,在左端引入零。
例子
#include <stdio.h>
int main(void)
{
unsigned int value = 65372U;
unsigned int result = value >> 2; // Shift right two bits
printf("\t result = %X\n", result);
return 0;
}
上面的代码生成以下结果。
带符号右移
对于负值的带符号值,最左边的位将为1,右移的结果取决于您的系统。
int new_value = -164; int new_result = new_value >> 2; // Shift right two bits
这将把new_value中的值向右移位两位,结果将存储在 new_result
中。
例子
#include <stdio.h>
int main(void)
{
int new_value = -164;
int new_result = new_value >> 2; // Shift right two bits
printf("\t result = %X\n", new_result);
return 0;
}
上面的代码生成以下结果。
op= 使用按位运算符
您可以使用op= 赋值形式中的所有二进制按位运算符。
异常是运算符〜
,它是一元运算符。
lhs op= rhs;
相当于语句:
lhs = lhs op (rhs);
这意味着如果你写:
value <<= 4;
效果是将整数变量的内容移位,值左移四位。
与以下内容完全相同:
value = value << 4;
此示例说明如何使用掩码从变量中选择多个位。
您将编写一个在变量中设置值的程序,然后使用按位运算符来反转十六进制数字的顺序。
#include <stdio.h>
int main(void)
{
unsigned int original = 0xAAA;
unsigned int result = 0;
unsigned int mask = 0xF; // Rightmost four bits
printf("\n original = %X", original);
// Insert first digit in result
result |= original & mask; // Put right 4 bits from original in result
// Get second digit
original >>= 4; // Shift original right four positions
result <<= 4; // Make room for next digit
result |= original & mask; // Put right 4 bits from original in result
/* Get third digit */
original >>= 4; // Shift original right four positions
result <<= 4; // Make room for next digit
result |= original & mask; // Put right 4 bits from original in result
printf("\t result = %X\n", result);
return 0;
}
上面的代码生成以下结果。