Для настройки битов часто бывает безопаснее использовать неподписанные типы, потому что сдвиги подписанных отрицательных значений имеют эффект, зависящий от реализации. Простой 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-talk байт может иметь более восьми бит (байт не является всегда октет). Это традиционный источник путаницы.
Вы хотите, чтобы это было на C или на C#? Тег .net3-5, который вы положили, будет означать C#, но вы также ставите тег C, который является непоследовательным. –
oops sorry, я имею в виду C. –
Это было весело! –