Проверьте настройки битов с помощью побитовых операторов - PullRequest
2 голосов
/ 02 апреля 2020

У меня есть этот источник 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)))))

Но мне это совсем не нравится! Я думал, что я бы использовал "~" вместо "!" Но это не работает. У кого-нибудь есть идеи, как это можно сделать, используя только побитовые операторы?

1 Ответ

3 голосов
/ 02 апреля 2020

Я хотел бы проверить, имеют ли биты СИНИЙ и ЗЕЛЕНЫЙ значения 1.

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

Применение & к комбинации битов дает вам подмножество этих битов которые были на. Вы знаете, что можете проверить любой из них, посмотрев, равен ли результат нулю (не все биты выключены). Чтобы проверить их все, просто проверьте, что результат совпадает с комбинацией битов, которые вы только что протестировали.

...