条件语句中的按位运算符
Bitwise operators in conditional statement
我试图在不更改原始位的情况下基于 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");
}
}
我很困惑,因为我认为这两段代码是相同的?谢谢!
这很容易解释:
0x6B
在您编写时,它被解释为默认整数(可能是 32 位)。所以(ch|0x6B)== 0x000000FF==0b00000000000000000000000011111111
。因此,~(ch|0x6B) == 0b11111111111111111111111100000000
不是 0,因此是 true
.
但是,如果您将该结果放入 char
,则仅保存低 8 位,因此 (unsigned char) ~(ch|0x6B) == 0
,计算结果为 false
。
在第一个示例中,您正在测试 m.s 之后的字符值。计算的位已被截断。
在第二个示例中,0x6B
是一个整数,因此 ch
被提升为 int 以进行计算,并且 m.s.bits(您反转)在测试。
有一种更简单(也更明显)的方法来测试是否设置了位 7、4、2、0 中的任何一位:
if ((ch & 0x95) != 0) { ... }
我试图在不更改原始位的情况下基于 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");
}
}
我很困惑,因为我认为这两段代码是相同的?谢谢!
这很容易解释:
0x6B
在您编写时,它被解释为默认整数(可能是 32 位)。所以(ch|0x6B)== 0x000000FF==0b00000000000000000000000011111111
。因此,~(ch|0x6B) == 0b11111111111111111111111100000000
不是 0,因此是 true
.
但是,如果您将该结果放入 char
,则仅保存低 8 位,因此 (unsigned char) ~(ch|0x6B) == 0
,计算结果为 false
。
在第一个示例中,您正在测试 m.s 之后的字符值。计算的位已被截断。
在第二个示例中,0x6B
是一个整数,因此 ch
被提升为 int 以进行计算,并且 m.s.bits(您反转)在测试。
有一种更简单(也更明显)的方法来测试是否设置了位 7、4、2、0 中的任何一位:
if ((ch & 0x95) != 0) { ... }