1

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

我正在检查第 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");
    }

}

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

4

2 回答 2

3

这很容易解释:

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

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

于 2015-06-07T18:00:27.250 回答
0

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

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

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

if ((ch & 0x95) != 0) { ... }
于 2015-06-07T18:06:16.793 回答