Как получить нижние 8 бит int?
Допустим, у меня есть переменная int n = 8. На большинстве машин это будет 32-битное значение. Как я могу получить только нижние 8 бит (младший байт) этого в двоичном формате? Кроме того, как я могу получить доступ к каждому биту, чтобы узнать, что это такое? Мой вопрос связан с C
4 ответа:
unsigned n = 8; unsigned low8bits = n & 0xFF;
Обратите внимание на несколько вещей:
- для побитовых операций всегда используйте типы
Битыunsigned
- могут быть извлечены из чисел с помощью двоичной маскировки с помощью оператора
&
- для доступа к низким 8 битам маска является
0xFF
, потому что в двоичном коде она имеет свои низкие 8 бит, а остальные 0- младшие 8 бит числа 8 являются... 8 (подумайте об этом на мгновение)
Чтобы получить доступ к определенному биту числа, произнесите
k
th бит:unsigned n = ...; unsigned kthbit = (1 << k) & n;
Теперь
kthbit
будет 0, еслиk
- й битn
равен 0, и некоторое положительное число (2**k
), Еслиk
- й битn
равен 1.
Используйте побитовую арифметику для маскировки младших 8 бит:
unsigned char c = (x & 0xFF);
Чтобы получить доступ к N-му младшему биту, уравнение равно
(x & (1 << n))
(n из нуля указывает на наименее значимый бит). Результат, равный нулю, означает, что бит чист, а ненулевой-что бит установлен.
Лучший способ-использовать битовый логический оператор & с соответствующим значением.
Итак, для нижних 8 бит:
n & 0xFF; /* 0xFF == all the lower 8 bits set */
Или как общее правило:
n & ((1<<8)-1) /* generate 0x100 then subtract 1, thus 0xFF */
Можно объединить с оператором сдвига битов, чтобы получить определенный бит:
(n & (1<<3))>>3; /* will give the value of the 3rd bit - note the >>3 is just to make the value either 0, or 1, not 0 or non-0 */
Вы можете проверить, установлен ли определенный бит в число с помощью
if (num & (1<<3)) ...
Проверит, установлен ли четвертый бит или нет.
Аналогично, вы можете извлечь только самые низкие 8 бит (как целое число), используя & с числом, которое имеет только самые низкие 8 бит, т. е.num & 255
илиnum & 0xFF
(в шестнадцатеричном виде).