C语言提供一些运算符可以直接操作整数中的位,称为位运算,这些运算符的操作数都必须是整形的。
按位取或运算符|,含义为有1则为1,真值表如下:
0 | 0 = 0;
0 | 1 = 1;
1 | 1 = 1;
按位取与运算符&,含义为有0则为0,真值表如下:
0 & 0 = 0;
0 & 1 = 0;
1 & 1 = 1;
按位取异或运算符^,含义为不相同则为1,真值表如下:
0 ^ 0 = 0;
0 ^ 1 = 1;
1 ^ 1 = 0;
按位取反运算符~,含义为该位0变1,1变0,真值表如下:
~0 = 1;
~1 = 0;
运算符~的特殊作用:不依赖于整数所包含的位的个数,使程序可移植性更好。
int a = ~0; // 得到一个整数,它的所有位为1
int a = ~0x1f; // 得到一个整数,除了最后5位其他的位全都为1
&、|、^运算符都是要做整形提升的,~运算符也要做整形提升,
所以在C语言中其实并不存大8位整数的位运算,操作数在做位运算之前都至少被提升为int型了。
// bit demo code 1
int main(void)
{
unsigned char c = 0xfc;
unsigned int i = ~c;
printf("i = 0x%x\n", i);
return 0;
}
不要将按位运算符 &, | 和 逻辑运算符 &&, || 混淆。
5 & 10 => 结果为0
5 && 10 => 结果为true
运算符 &, |, ^ 的优先级比关系运算符和判等运算符低。
// bit demo code 2
int main(void)
{
unsigned int status = 0x0;
if (status & 0x4000 == 0)
printf("=> (status & 0x4000) == 0 \n");
else
printf("=> status & (0x4000 == 0) \n");
return 0;
}