Я читал статью в Википедии о битовых полях и увидел, как можно использовать двоичные числа для представления основных цветов и комбинировать их с помощью операторов побитового ИЛИ (|
). Я хочу проверить, содержится ли один цвет в другом.
#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;
}
Я понимаю, почему это происходит, но есть ли побитовая операция или их комбинация, которая позволяет достичь желаемого результата?
Вы меняете &
на in
, чтобы он больше походил на естественный язык. Тем временем оператор &
не заботится о том, в каком порядке находятся левый и правый аргументы. Он просто проверяет, установлены ли биты.
@ 500-InternalServerError: Нет, это не так.
Но &
симметричен. поэтому A & B == B & A. Улучшив &
, чтобы он выглядел как асимметричное отношение «in», вы запутались.
#define in &
— Писать такой код — крайне плохая практика. Плохое, как мгновенное увольнение с работы по программированию на C.
Если вы хотите проверить, являются ли все основные цвета данного цвета 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;
}
и использовать его так
unsigned magenta = MAGENTA;
unsigned blue = BLUE;
printf("%s\n", contains( magenta, blue ) ? "true" : "false"); // true
printf("%s\n", contains( blue, magenta ) ? "true" : "false"); // false
Использование unsigned int
для побитовых операций намного лучше, чем int
.
@AndrewHenle, конечно, ты прав. Зафиксированный
Использование побитовых операторов в качестве своего рода цветовой логики — просто очень плохая идея для начала. contains(WHITE, BLACK)
О, хорошо, белое содержит черное. ОП должен просто забыть обо всем этом и двигаться дальше.
(magenta & blue) == magenta