使用按位运算符检查位设置
Check the bit settings with the bitwise operators
我有这个来源 C:
#include <stdio.h>
#define BLUE 1
#define GREEN 2
#define RED 4
int main(void) {
unsigned short i;
char *array[8] = { "000", "001", "010", "011", "100", "101", "110", "111"};
for(i = 0x0000; i <= 0x0007; i++) {
printf("%d) %s -> ", i, array[i]);
if(i & (BLUE | GREEN))
printf("V\n");
else
printf("F\n");
}
printf("\n\n");
for(i = 0x0000; i <= 0x0007; i++) {
printf("%d) %s -> ", i, array[i]);
if(!((i | (BLUE)) ^ (i | (GREEN))))
printf("V\n");
else
printf("F\n");
}
return 0;
}
通过程序的第一个 FOR,我了解了表达式行为的真相 table:
(i & (BLUE | GREEN))
也就是说,他们能够验证至少一个蓝色或绿色位(或两者)被设置为 1。
现在,我想检查 BLUE 和 GREEN 位是否都为 1。
我设法用表达式做到了这一点:
(! ((i | (BLUE)) ^ (i | (GREEN)))))
但是我一点都不喜欢!我以为我会用“~”而不是“!”但它不起作用。任何人都知道如何仅使用按位运算符来完成此操作?
I would like to check if both the BLUE and GREEN bits are at 1.
(i & (BLUE|GREEN)) == (BLUE|GREEN)
将 &
应用于位的组合,可以得到那些打开的位的子集。您知道您可以通过查看结果是否为零(并非所有位都关闭)来测试其中任何一个。要测试所有这些,只需测试结果是否与您刚刚测试的位组合相同。
我有这个来源 C:
#include <stdio.h>
#define BLUE 1
#define GREEN 2
#define RED 4
int main(void) {
unsigned short i;
char *array[8] = { "000", "001", "010", "011", "100", "101", "110", "111"};
for(i = 0x0000; i <= 0x0007; i++) {
printf("%d) %s -> ", i, array[i]);
if(i & (BLUE | GREEN))
printf("V\n");
else
printf("F\n");
}
printf("\n\n");
for(i = 0x0000; i <= 0x0007; i++) {
printf("%d) %s -> ", i, array[i]);
if(!((i | (BLUE)) ^ (i | (GREEN))))
printf("V\n");
else
printf("F\n");
}
return 0;
}
通过程序的第一个 FOR,我了解了表达式行为的真相 table:
(i & (BLUE | GREEN))
也就是说,他们能够验证至少一个蓝色或绿色位(或两者)被设置为 1。
现在,我想检查 BLUE 和 GREEN 位是否都为 1。 我设法用表达式做到了这一点:
(! ((i | (BLUE)) ^ (i | (GREEN)))))
但是我一点都不喜欢!我以为我会用“~”而不是“!”但它不起作用。任何人都知道如何仅使用按位运算符来完成此操作?
I would like to check if both the BLUE and GREEN bits are at 1.
(i & (BLUE|GREEN)) == (BLUE|GREEN)
将 &
应用于位的组合,可以得到那些打开的位的子集。您知道您可以通过查看结果是否为零(并非所有位都关闭)来测试其中任何一个。要测试所有这些,只需测试结果是否与您刚刚测试的位组合相同。