【问题标题】:Bitwise operators in conditional statement条件语句中的位运算符
【发布时间】:2023-04-05 01:05:01
【问题描述】:

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

}

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

【问题讨论】:

    标签: c bitwise-or


    【解决方案1】:

    这很容易解释:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-04-19
        • 2011-02-18
        • 2013-02-16
        • 2015-02-08
        • 2015-06-30
        • 2016-12-17
        • 2012-03-26
        • 1970-01-01
        • 2020-08-19
        相关资源
        最近更新 更多