条件语句中的按位运算符

时间:2015-06-07 17:53:13

标签: c bitwise-or

我正在尝试根据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");
    }

}

我觉得这两段代码完全相同,我很难过?谢谢!

2 个答案:

答案 0 :(得分:3)

这很容易解释:

写入时

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

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

答案 1 :(得分:0)

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

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

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

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