Проверка бита символа

#c #byte #shift

#c #байт #сдвиг

Вопрос:

Я пытаюсь проверить один конкретный бит символа, например, один смайлик «😁» в первом октете, у нас есть «11110xxx», и мне нужно проверить, соответствует ли 3 биту 0, но я не знаю, что делать!

Я получаю некоторый код из Интернета, например:

 printf( "%d", ( buffer[0] >> 3 ) amp; 1 ? 1 : 0);
 

И это работает, но я попробовал это:

 printf("%d", (buffer[0] >> 3) amp; 1);
 

И работает, но без amp; 1 не работает:
Итак, мне интересно, для чего это:

 ? 1 : 0 //Works without
 

и amp; 1 то, что его нужно для работы

Другое дело, что я сдвинулся справа налево или слева направо? Я попробовал это:

 printf("%d", (buffer[0] << 3) amp; 1);
 

Но не работает.

Я пытаюсь научиться работать с байтами

Комментарии:

1. ( buffer[0] >> 3 ) amp; 1 будет возвращать только 1 or 0 , поэтому тернарный оператор в этом случае не нужен.

2. @AndrewHenle Это то, что мне нужно, потому что он всегда возвращает 1 или 0 с этим

3. Использование !! (два логических оператора NOT) — это еще один способ возврата 1 для true и 0 для false .

Ответ №1:

? 1 : 0 является второй половиной троичного оператора. Запись A ? B : C B вычисляется, когда A значение true (отличное от нуля), и C вычисляется, когда A значение false (ноль).

amp; 1 является побитовым и оператором и единицей. Он извлекает последний бит (LSB), используя путем взятия И с единицей.

Если вы хотите использовать сдвиг справа налево, вы можете применить это к 1 .

 printf("%d", buffer[0] amp; (1 << 3) ? 1 : 0);
 

Комментарии:

1. Так что, если я не использую ‘? 1: 0’ все в порядке, потому что мне не нужно заменять оператор на троичный оператор

2. если я хочу перейти справа налево, мне не нужно использовать buffer[0] amp; (1 << 5) ? 1 : 0) , потому что я хочу 3 бита? Если я иду слева направо, это 3-й, но если я иду справа налево, становится 5-м

Ответ №2:

И работает, но без amp; 1 не работает.

Потому amp; 1 что устанавливает все биты, кроме младшего, равными нулю. Пример: 0xff >> 3 == 0x1f и (0xff >> 3) amp; 1 == 1 .

2.

Другое дело, что я сдвинулся справа налево или слева направо? Я попробовал это:

 printf("%d", (buffer[0] << 3) amp; 1);
 

При сдвиге влево младшие биты устанавливаются равными нулю. Таким образом, результат amp; 1 всегда будет равен нулю (как объяснено в пункте 1).

Как правило, если вы хотите проверить, установлен ли n-й бит, вы можете:

 (val >> n) amp; 1
 

val amp; (1 << n) — если используется в логическом операторе if или если вам нужно, чтобы значение было zero или one : !!(val amp; (1 << n)) или val amp; (1 << n) ? 1 : 0 или (val amp; (1 << n)) >> n