Для настройки битов часто безопаснее использовать неподписанные типы, потому что сдвиги отрицательных значений со знаком имеют эффект, зависящий от реализации. Обычный 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, байт может иметь более восьми бит (байт не всегда октет). Это традиционный источник путаницы.