Управление битами символьной переменной - PullRequest
2 голосов
/ 31 марта 2011

Моя цель состоит в том, чтобы создать переменную типа char путем присвоения значений каждому биту, т.е. мне нужно назначить 0 и 1 для каждого бита.

Я сделал следующий код:

char packet;
int bit;
packet &= ~(1 << 0);

packet |= (1 << 1);

printf("\n Checking each bit of packet: \n");

for(int x=0;x<2;x++)
{
    bit = packet & (1 << x);
    printf("\nBit [%d] of packet : %d", x, bit);
}

Но я получаю вывод:

Bit[0] of packet : 0
Bit[1] of packet : 2

В чем здесь проблема?

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

Здесь нет проблем, вывод правильный.

Вот причина:

Когда вы устанавливаете значение пакета с помощью |=, значение равно 10, что вдесятичный, равен 2. Когда вы присваиваете packet & (1 << x) для bit, вы фактически присваиваете значение 2 (10 в двоичном виде). ​​

Запись в Википедии:

Чтобы определить, равен ли второй бит 1, к нему применяется побитовое И и еще одна битовая комбинация, содержащая 1 во втором бите:

    0011 (decimal 3) 
AND 0010 (decimal 2)   
  = 0010 (decimal 2)

Если ваше намерение состоит в том, чтобыпросто проверьте логическое значение того, был ли установлен бит, просто приведите его к значению bool.

(Надеюсь, все это имеет смысл, я немного устал;))

1 голос
/ 31 марта 2011

Первым делом:

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.

0 голосов
/ 31 марта 2011

Этот вывод выглядит вполне ожидаемым. Бит 0 не установлен, бит 1 установлен. Возможно, вы после

bit = !!(packet & (1 << x));

... если вы хотите получить результат 0 или 1.

Кстати, вы должны инициализировать packet - использование неинициализированной переменной приводит к неопределенному поведению.

...