返回首页   进站必读

6.1 各类运算符(|、&、^、~)


6.1 各类运算符(|、&、^、~)

6.1.1 位运算的定义

C语言提供一些运算符可以直接操作整数中的位,称为位运算,这些运算符的操作数都必须是整形的。

6.1.2 运算符|

按位取或运算符|,含义为有1则为1,真值表如下:

0 | 0 = 0;
0 | 1 = 1;
1 | 1 = 1;

6.1.3 运算符&

按位取与运算符&,含义为有0则为0,真值表如下:

0 & 0 = 0;
0 & 1 = 0;
1 & 1 = 1;

6.1.4 运算符^

按位取异或运算符^,含义为不相同则为1,真值表如下:

0 ^ 0 = 0;
0 ^ 1 = 1;
1 ^ 1 = 0;

6.1.5 运算符~

按位取反运算符~,含义为该位0变1,1变0,真值表如下:

~0 = 1;
~1 = 0;

运算符~的特殊作用:不依赖于整数所包含的位的个数,使程序可移植性更好。

int a = ~0;         // 得到一个整数,它的所有位为1
int a = ~0x1f;      // 得到一个整数,除了最后5位其他的位全都为1

6.1.6 类型提升

&、|、^运算符都是要做整形提升的,~运算符也要做整形提升,
所以在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;
}

6.1.7 易混淆的错误

不要将按位运算符 &, | 和 逻辑运算符 &&, || 混淆。

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;
}