条件语句中的按位运算符

Bitwise operators in conditional statement

我试图在不更改原始位的情况下基于 bit-wise 运算符输入 if 语句,我很困惑为什么我所拥有的不起作用。

我正在检查它是否至少有一位 7、4、2 是 0

工作代码:(它改变了我不想要的原始位)

#include <stdio.h>

void main() {

    unsigned char ch = 0b11111111;

    ch = ~(ch | 0x6B);

    if(ch) {

        printf("%s\n", "YES");
    } 

    else {           

        printf("%s\n", "NO");        
    }

}

如果将位 7、4 或 2 更改为 0,则打印 NO(应该如此)并打印 YES

无效代码:

#include <stdio.h>

void main() {

    unsigned char ch = 0b11111111;

    if(~(ch | 0x6B)) {

        printf("%s\n", "YES");
    } 
    else {

        printf("%s\n", "NO");
    }

}

我很困惑,因为我认为这两段代码是相同的?谢谢!

这很容易解释:

0x6B 在您编写时,它被解释为默认整数(可能是 32 位)。所以(ch|0x6B)== 0x000000FF==0b00000000000000000000000011111111。因此,~(ch|0x6B) == 0b11111111111111111111111100000000 不是 0,因此是 true.

但是,如果您将该结果放入 char,则仅保存低 8 位,因此 (unsigned char) ~(ch|0x6B) == 0,计算结果为 false

在第一个示例中,您正在测试 m.s 之后的字符值。计算的位已被截断。

在第二个示例中,0x6B 是一个整数,因此 ch 被提升为 int 以进行计算,并且 m.s.bits(您反转)在测试。

有一种更简单(也更明显)的方法来测试是否设置了位 7、4、2、0 中的任何一位:

if ((ch & 0x95) != 0) { ... }