Первым делом:
char packet;
packet &= ~(1 << 0);
Это ненадежно, поскольку packet
начинается с того, что было в памяти последним (т. Е. Мусором). 1 << 0
это просто 1
. ~1
это ... 111110. И то, что с packet
каждый раз будет давать разные ответы, в зависимости от того, что было в памяти последней единственная надежная вещь состоит в том, что последний бит (т.е. наименее значимый) будет установлен на 0
.
packet |= (1 << 1);
Это просто устанавливает второй бит на 1
. Так что теперь packet
это xxxxxx10
.
Затем ваш цикл проходит первые два бита; каждый бит маскируется packet & (1 << x)
, но только маскирует его, он не перемещает его. Итак, во время первой итерации 1 << x
равно 1
, и вы получите первый бит (0
). Вторая итерация, 1 << x
- это 10
, или 2 в десятичном виде. Anding xxxxxx10
с 10
дает 10
, который вы быстро распечатываете (он выглядит в формате 2
).
Если вы хотите переместить бит (чтобы выделить его как 0 или 1), вы можете использовать:
bit = (packet & (1 << x)) >> x;
Или эквивалентный, но более читаемый
bit = (packet >> x) & 1;
Это даст (я предполагаю желаемый) вывод 0
, 1
вместо 0
, 2
.