Битовые строки и смещение флага - PullRequest
0 голосов
/ 25 марта 2019

Я довольно плохо знаком с побитовым и всем этим забавным джазом, и поэтому не совсем понимаю все об этом.У меня два вопроса.

A) Вопрос о флагах и битах

Я недавно столкнулся с чем-то похожим на приведенное ниже

if (flags & (1 << 3)) {
    function_A();
}

Я вижуis является оператором AND и сдвигом левого бита, однако я не уверен, что делает флаг и его назначение (насколько я понимаю, это набор логических значений для экономии места), когда я обычно сталкиваюсь с левыми сдвигами, это что-то вроде 10100101<< 3, что было бы 00101000 (я полагаю), но это, похоже, не так.Итак, каковы именно условия, при которых вышеуказанная функция будет вызываться? </p>

B) Также вопрос о флажках (связанный с первым из-за его характера).

TCP содержат пакеты, которые состоят из 1-битных флагов в байте 13. Существует бит 13-го байта (я полагаю, 1-й бит), который является флагом SYN для запроса соединения.Чтобы «запросить соединение», как именно вы будете называть этот бит, предполагая, что вы можете получить к нему доступ, предполагая, что он хранится в каком-то массиве и доступен VIA packetNO [13].Будет ли это похоже на ниже?

if (packetNO[13] & (1 << 2)) {
}

вышеупомянутая проверка, было ли запрошено соединение, путем смещения истинного бита в позицию 2 (бит 1?)

Пожалуйста, объясните мне эти понятия и предоставьте примеры, чтобы помочь, есливозможно, я не уверен, прав ли я или нет.

1 Ответ

1 голос
/ 25 марта 2019

Оператор и таков, что его вывод равен единице, только если оба операнда равны 1. Следовательно

if(f & 1) { ... }

тесты - это младший значащий бит f.

Если вы хотите проверить, установлен ли другой бит, есть два способа сделать это.

  1. используйте оператор побитового сдвига <<, который сместит свой операнд на заданную величину. Например, чтобы проверить, установлен ли третий бит (или бит № 2, считая из lsb), вы используете 1<<2. Это приведет к числу, равному 000..00100, а по и ing будет проверено, установлен ли соответствующий бит.
if(f & (0x1<<2)) { ... }
  1. В качестве альтернативы, вы можете использовать шестнадцатеричные числа, описывающие битовую комбинацию, которую вы хотите проверить. Тот же тест можно выполнить, используя 0x4, так как двоичный код 4 равен 000..0100
if(f & 0x4) { ... }

Вам решать, какой из них более читабелен.

Итак, первый тест в вашем вопросе проверяет, установлен ли четвертый бит флага (бит № 3), а второй проверяет, установлен ли бит № 1 packect[13].

...