在 C 中使用按位运算符将颜色与位域混合?

Fir*_*ser 2 c bit-manipulation bitwise-operators bit-fields

我正在阅读有关位域的维基百科条目,并了解如何使用二进制数来表示原色并使用按位 OR ( |) 运算符将它们组合起来。我想检查一种颜色是否包含在另一种颜色中。

#include <stdio.h>

// primary colors
#define RED 0b001
#define GREEN 0b010
#define BLUE 0b100

// mixed colors 
#define BLACK 0b000
#define YELLOW (RED | GREEN)
#define MAGENTA (RED | BLUE)
#define CYAN (BLUE | GREEN)
#define WHITE (RED | GREEN | BLUE)

int main(void) 
{
    int magenta = MAGENTA;
    int blue = BLUE;

#define in &  // check if a color A is contained in another color B:
    printf("%s\n", blue in magenta ? "true" : "false"); // true
    printf("%s\n", magenta in blue ? "true" : "false"); // should be false but is true.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我明白为什么会发生这种情况,但是是否有按位运算或其组合可以实现我想要的结果?

Ing*_*rdt 6

如果你想检查给定颜色的所有原色是否a也是另一种颜色的一部分,b你可以使用这样的函数来完成(正如@Andrew Henle正确提到的,最好对位字段使用无符号类型):

unsigned contains( unsigned b, unsigned a )  // returns != 0 if all primary colors of a are also part of b
{
  return ( b & a ) == a;
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它

unsigned magenta = MAGENTA;
unsigned blue = BLUE;

printf("%s\n", contains( magenta, blue ) ? "true" : "false"); // true
printf("%s\n", contains( blue, magenta ) ? "true" : "false"); // false
Run Code Online (Sandbox Code Playgroud)