我正在尝试根据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");
}
}
我觉得这两段代码完全相同,我很难过?谢谢!
答案 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) { ... }