C语言中利用位字段与位运算实现颜色包含判断的正确方法
正确实现颜色包含判断的位运算方法
你的问题出在直接用&运算符判断,magenta & blue结果为非零值,因此被判定为true。要正确判断颜色A是否包含在颜色B中,需要验证A的所有有效位都在B中存在,对应的位运算组合是:(A & B) == A。
修改后的代码示例
#include <stdio.h> // 原色定义 #define RED 0b001 #define GREEN 0b010 #define BLUE 0b100 // 混合色定义 #define BLACK 0b000 #define YELLOW (RED | GREEN) #define MAGENTA (RED | BLUE) #define CYAN (BLUE | GREEN) #define WHITE (RED | GREEN | BLUE) // 定义判断宏:A是否包含在B中 #define is_contained_in(A, B) ((A & B) == A) int main(void) { int magenta = MAGENTA; int blue = BLUE; printf("%s\n", is_contained_in(blue, magenta) ? "true" : "false"); // true printf("%s\n", is_contained_in(magenta, blue) ? "true" : "false"); // false return 0; }
原理说明
A & B会保留同时存在于A和B中的位。如果A完全包含在B中,那么这个结果就和A完全一致。- 比如
magenta & blue得到BLUE,和magenta(RED|BLUE)不相等,因此返回false,符合预期。 - 特殊情况:
BLACK(0)会被判定为包含在任何颜色中,因为(0 & B) == 0总是成立,这符合逻辑——黑色不包含任何原色,自然属于所有颜色的子集。
内容的提问来源于stack exchange,提问作者First User
相关产品推荐
相关产品推荐

