У меня есть этот источник 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.
Теперь я хотел бы проверить, равны ли СИНИЙ и ЗЕЛЕНЫЙ биты 1. 1. удалось сделать это с выражением:
(! ((i | (BLUE)) ^ (i | (GREEN)))))
Но мне это совсем не нравится! Я думал, что я бы использовал "~" вместо "!" Но это не работает. У кого-нибудь есть идеи, как это можно сделать, используя только побитовые операторы?