Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 条件语句中的位运算符_C_Bitwise Or - Fatal编程技术网

C 条件语句中的位运算符

C 条件语句中的位运算符,c,bitwise-or,C,Bitwise Or,我试图在不更改原始位的情况下,根据逐位运算符输入if语句,我不明白为什么我的语句不起作用 我正在检查它是否至少有一个位7、4、2为0 工作代码:(它更改原始位,我不需要) 我很困惑,因为我认为这两段代码是相同的?谢谢 这很容易解释: 0x6B在编写时,它会被解释为默认整数(可能是32位)。因此(ch | 0x6B)=0x000000FF==0b00000000000000000000000000001111111。因此,~(ch | 0x6B)=0b11111111100000000,它不是0,

我试图在不更改原始位的情况下,根据
逐位
运算符输入
if
语句,我不明白为什么我的语句不起作用

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

工作代码:(它更改原始位,我不需要)


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

这很容易解释:

0x6B
在编写时,它会被解释为默认整数(可能是32位)。因此
(ch | 0x6B)=0x000000FF==0b00000000000000000000000000001111111
。因此,
~(ch | 0x6B)=0b11111111100000000
,它不是0,因此是
真的


但是,如果您将该结果放入
字符
,则仅保存较低的8位,因此
(无符号字符)~(ch | 0x6B)=0
,其计算结果为

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

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

如果设置了位7,4,2,0中的任何一位,则有一种更简单(且更明显)的测试方法:

if ((ch & 0x95) != 0) { ... }
#include <stdio.h>

void main() {

    unsigned char ch = 0b11111111;

    if(~(ch | 0x6B)) {

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

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

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