Как получить самый значимый бит 8-битного типа без знака в C - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь получить самый старший бит 8-битного типа без знака в C.

Вот что я сейчас пытаюсь сделать:

uint8_t *var = ...;
...
(*var >> 6) & 1

Это правильно? Если это не так, что будет?

Ответы [ 3 ]

6 голосов
/ 03 апреля 2019

Самый стандартный / правильный способ маскирования битов - это использование читаемой битовой маски вида 1u << bit.Любой программист на Си, заметивший в коде 1u << n, будет знать, что это битовая маска - так что это самодокументируемый код.

Поэтому, если вы хотите получить бит 7, вы должны написать

*var & (1u << 7)

Суффикс u важен для надежного кода, так как вы хотите избежать случайного неявного продвижения на подписанные типы.

6 голосов
/ 03 апреля 2019

Для получения старшего значащего бита из памяти, на которую указывает указатель uint8_t, необходимо сместить на 7 бит.

(*var >> 7) & 1
2 голосов
/ 03 апреля 2019

Другой вариант - просто применить битовую маску и проверить полученное значение:

*var & 0x80u // 1000 0000
...