Я запутался с битовыми масками - PullRequest
0 голосов
/ 12 мая 2019

Я использую встроенное рабочее место IAR и C. Я хотел бы создать маску и решить, равен ли следующий бит для передачи 1 или 0.

Я попробовал это, но не сработало

int transmit(int signal, int number_of_bits)
{

    int mask;
    for (int i = 0; i < number_of_bits; i++)
    {
        mask = pow(2,number_of_bits-1-i)
        if ((signal & mask) == 0) // bit '0'
        {
            transmit0();
        }
        else // bit '1'
        {
            transmit1();
        }
    }
}

И я попробовал это, он передает 0001, но я пытаюсь передать 1000 (наоборот)

int transmit(int signal, int number_of_bits)
{

    int mask;
    for (int i = 0; i < number_of_bits; i++)
    {
        mask = (1 << i);
        if ((signal & mask) == 0) // bit '0'
        {
            transmit0();
        }
        else // bit '1'
        {
            transmit1();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Здесь mask - это переменная, которая всегда будет содержать значение «степень 2».Цель состоит в том, чтобы в mask всегда был установлен только один бит.Это mask используется для проверки каждого бита в «изоляции».

В сочетании с логической AND -функцией вы можете видеть его как фильтр, который дает вам только значение, которому соответствует конкретный бит, или ничего (ноль).

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

Давайте рассмотрим некоторые практические значения во время работы программы (в предположении 8 бит).Таким образом, в цикле for это значение mask выглядит с течением времени:

00000001
00000010
00000100
00001000
00010000
...

Примечание: вы также можете перейти в обратном направлении, например, если получатель хочет увидеть самое высокоебит первый и самый последний последний.Не знаю, что здесь нужно, но просто чтобы ты знал.Если вы хотите перейти в обратном направлении, вы инициализируете mask с помощью (1 << (num_bits-1)), а затем каждый раз в самом цикле переходите на один шаг вправо mask >>= 1).

Каждое значение маски является побитовым AND -ed (оператор &) с входным значением signal, чтобы "отфильтровать" тот конкретный интересующий нас бит.

Помните: результат этой операции AND по-прежнему состоит из нескольких битов -- ни одного бита, поэтому мы не можем искать значение 1 (мы также должны были бы проверить для случаев 2, 4, 8 ... и т. д.).

Пример, так что давайтескажем, все биты включены, тогда логический вывод И будет выглядеть следующим образом:

00000001 AND 11111111 = 00000001
00000010 AND 11111111 = 00000010
00000100 AND 11111111 = 00000100
00001000 AND 11111111 = 00001000
00010000 AND 11111111 = 00010000
...

Обратите внимание, как в этом случае результат соответствует маске.Хотя значения каждый раз меняются, вы знаете, что когда вы получаете что-то ненулевое, бит, который вы тестируете, должен быть высоким!

И если все биты выключены, вы увидите это:

00000001 AND 00000000 = 00000000
00000010 AND 00000000 = 00000000
00000100 AND 00000000 = 00000000
00001000 AND 00000000 = 00000000
00010000 AND 00000000 = 00000000

Вы заметите, что легче проверить, равен ли результат нулю.Это означает, что бит был выключен.Именно поэтому код проверяет только нулевое значение, он знает, что бит равен 1 во всех других случаях!

Теперь хитрость заключается в том, чтобы получить правильное значение маски.Вам нужно сдвинуть битовое значение 1 влево на правильное место.Так, например, если вы начнете тестирование для бита 4, вы сдвинете 1 на четыре позиции влево, и вы получите (00010000 двоичный код).

Для этого мы используем оператор сдвига влево <<.

Как уже говорили другие, ^, к сожалению, делает что-то совершенно другое (XOR), что добавляет путаницу.

0 голосов
/ 12 мая 2019

Как заметил @LF, ^ НЕ является оператором мощности, увы <<, оператор побитового сдвига, добивается цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...