Для настройки битов часто безопаснее использовать типы без знака, потому что сдвиги отрицательных значений со знаком имеют эффект, зависящий от реализации. Обычный char
может быть как подписанным, так и неподписанным (традиционно он не подписан на платформах MacIntosh, но подписан на ПК). Следовательно, сначала приведите своего персонажа к типу unsigned char
.
Тогда вашими друзьями будут побитовые логические операторы (&
, |
, ^
и ~
) и операторы сдвига (<<
и >>
). Например, если ваш персонаж находится в переменной x
, то для получения 5-го бита вы просто используете: ((x >> 5) & 1)
. Операторы сдвига перемещают значение вправо, отбрасывая пять младших битов и перемещая интересующий вас бит в «самое нижнее положение» (он же «крайний правый»). Побитовое И с 1 просто устанавливает все остальные биты в 0, поэтому результирующее значение равно 0 или 1, что является вашим битом. Обратите внимание, что я нумерую биты от левого значащего (самого правого) до самого значащего (крайнего левого) и начинаю с нуля, а не с единицы.
Если вы предполагаете, что ваши символы 8-битные, вы можете написать свой код как:
unsigned char x = (unsigned char)your_character;
int i;
for (i = 7; i >= 0; i --) {
if (i != 7)
printf(",");
printf("%s", ((x >> i) & 1) ? "true" : "false");
}
Вы можете заметить, что, поскольку я нумерую биты справа налево, а вы хотите выводить слева направо, индекс цикла должен уменьшаться.
Обратите внимание, что в соответствии со стандартом C unsigned char
имеет по крайней мере восемь бит, но может иметь и больше (в настоящее время только несколько встроенных DSP имеют символы, которые не являются 8-битными). Для дополнительной безопасности добавьте это в начало кода (как объявление верхнего уровня):
#include <limits.h>
#if CHAR_BIT != 8
#error I need 8-bit bytes!
#endif
Это предотвратит успешную компиляцию, если целевая система окажется одним из этих специальных встроенных DSP. Как примечание к примечанию, термин «байт» в стандарте C означает «элементарную единицу памяти, которая соответствует unsigned char
», так что, на языке C, байт может иметь более восьми битов (байт не является всегда октет). Это традиционный источник путаницы.
person
Thomas Pornin
schedule
02.02.2010