#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
or0
, поэтому тернарный оператор в этом случае не нужен.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