2015-06-07 2 views
1

Я пытаюсь ввести оператор if на основе оператора bit-wise без изменения исходных битов, и я смущен, почему то, что у меня есть, не работает.Побитовые операторы в условном заявлении

Я проверяю, является ли это наименьшим из разрядов 7, 4, 2 являются 0.

Рабочий код (он изменяет исходные биты, которые я не хочу)

#include <stdio.h> 

void main() { 

    unsigned char ch = 0b11111111; 

    ch = ~(ch | 0x6B); 

    if(ch) { 

     printf("%s\n", "YES"); 
    } 

    else {   

     printf("%s\n", "NO");   
    } 

} 

, который печатает NO (как это необходимо) и печатает YES, если изменить немного 7, 4, или 2, чтобы 0.

Неработающий код:

#include <stdio.h> 

void main() { 

    unsigned char ch = 0b11111111; 

    if(~(ch | 0x6B)) { 

     printf("%s\n", "YES"); 
    } 
    else { 

     printf("%s\n", "NO"); 
    } 

} 

Я довольно озадачен, как я думаю, что эти две части кода являются одинаковые? Благодаря!

ответ

3

Это легко объяснить:

0x6B, как вы пишете, что получает интерпретируется как целое число по умолчанию (вероятно, 32 бит). Итак, (ch|0x6B)== 0x000000FF==0b00000000000000000000000011111111. Следовательно, ~(ch|0x6B) == 0b11111111111111111111111100000000, который не равен 0, следовательно, равен true.

Если, однако, поставить этот результат в char, только младшие 8 бит сохраняются, и, следовательно, (unsigned char) ~(ch|0x6B) == 0, который вычисляет false.

+0

Спасибо, что решить эту проблему, и делает много смысла. – fenton06

0

В первом примере вы тестируете значение символа после m.s. биты вычисления были усечены.

Во втором примере 0x6B является целым числом, поэтому ch присваивается int для вычисления, а m.s.bits (который вы инвертируете) рассматриваются в тесте.

Существует более простой (и более очевидный) способ проверить, если любой из битов 7,4,2,0 устанавливаются:

if ((ch & 0x95) != 0) { ... } 
Смежные вопросы