【问题标题】:Check the bit settings with the bitwise operators使用位运算符检查位设置
【发布时间】:2020-04-02 17:17:35
【问题描述】:

我有这个来源 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,我得到了表达式行为的真值表:

(i & (BLUE | GREEN))

也就是说,他们能够验证蓝色或绿色位(或两者)中的至少一个设置为 1。

现在,我想检查 BLUE 和 GREEN 位是否都为 1。 我设法用表达式做到了这一点:

(! ((i | (BLUE)) ^ (i | (GREEN)))))

但我一点也不喜欢!我以为我会使用“~”而不是“!”但它不起作用。任何人都知道如何仅使用按位运算符来完成此操作?

【问题讨论】:

  • 为什么不i &amp; (BLUE | GREEN) == (BLUE | GREEN)

标签: c bitwise-operators


【解决方案1】:

我想检查 BLUE 和 GREEN 位是否都为 1。

(i & (BLUE|GREEN)) == (BLUE|GREEN)

&amp; 应用于位组合可为您提供这些位的子集。您知道您可以通过查看结果是否为零(并非所有位都关闭)来测试其中的任何一个。要测试所有这些,只需测试结果是否与您刚刚测试的位组合相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2011-11-05
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多