2016-07-22 2 views
2

Раствор из top answer являетсяСдвиг вправо с побитового И

Чтобы проверить немного, сдвиг числа х вправо, то побитовое И это:

bit = (number >> x) & 1;

Это поставит значение бит x в бит переменной.

Что меня смущает это, когда предполагая следующее:

unsigned number = 5; //0101 
int x = 2; // 

После сдвига (number >> x) мы получаем 0001. Но мы сдвинутые биты 1 и 2 и поэтому, когда мы делаем побитовое И, не мы делаем это против немного третьего и не второй, где x = 2? Не означает ли это, что если я хочу, чтобы проверить, если бит x установлен, я не должен делать:

bit = (number >> (x - 1)) & 1); 
+0

Я думаю, что мы делаем это против 3-го бита справа, так как мы вытащили 2 бита, и теперь мы на третьем. – MathBunny

+0

«бит n» является (n + 1) -й бит. – Olaf

+0

Рассмотрите возможность проверки на первый бит ... там не нужно будет сдвигаться, поэтому при сдвиге n бит вы проверите бит n + 1. –

ответ

5

Да, вы делаете побитовое И против третьего бита. Рассмотрим x быть нулевой индекс, т.е. первый бит бит 0.

+0

Ах ладно. Я знал, что мы начали битовые индексы на 'x_i: i = 0', но я не знал, что когда мы говорим« Проверяем второй бит »на английском языке, мы на самом деле имеем в виду контрольный бит' x_2', где это действительно третий бит в список – 8protons

+0

Извините за дополнительный вопрос: так что, если я пытаюсь проверить флаг бит в регистре, и в документации говорится: «проверьте, установлен ли 5-й бит для этой функции», я делаю '(функция >> 5) & 1' или '(функция >> 4) & 1'? – 8protons

+1

Точно: второй бит бит 1 ... Это может быть еще более сбивающим с толку, потому что некоторые люди набирают биты от самых значительных до наименее значимых, потому что так они отображаются слева направо на диаграмме. – chqrlie

0

Номер бита представляет собой степень двойки. Таким образом, когда x это два, вы говорите бит 2 = 2 ** 2 = 4.

Наименее значимый бит (или «самый правый» бит, если вы предпочитаете это бит 0, не битную 1.

Кроме того, нет никаких причин, чтобы фактически сделать бит сдвига, если ваш «номер бита» не находится в переменной.

Например, чтобы проверить бит 5 из значения, просто сделать

if (variable & 0x20) 
    bit_is_set(); 

Здесь 0x20 просто 2 ** 5, (или 1 < < 5)

+0

Что сбивает с толку слова «сила двух»? Для программиста? – kdopen

2

Вы сказали:

После сдвига (number >> x) мы получаем 0001. Но мы сдвинутые биты 1 и 2 и поэтому, когда мы делаем побитовое И, не мы делаем это против немного третьего и не второй, где x = 2? Значит ли это не что, если я хочу, чтобы проверить, если бит x установлен, я не должен делать:

bit = (number >> (x - 1)) & 1); 

Чтобы получить значение 1 наименьший значащий бит, вам нужно (number >> 0) & 1.
Чтобы получить значение второго младшего значащего бита, вам нужно (number >> 1) & 1.
Чтобы получить значение 3-го наименее значимого бита, вам нужно (number >> 2) & 1.

и т.д.

Другими словами,

первое означает 0 бит для сдвига
второго означает 1 бит для сдвига
третьего означает 2 бита сдвига
Nth означает N-1 бит для сдвига

Я надеюсь, что делает его немного понятнее для вас.

+0

Большое спасибо. Я в основном был замешан на этой небольшой детали, потому что я пытаюсь проверить регистр на определенную функцию ЦП (если она включена или нет). В документе Wiki говорится: «Если поддерживается, устанавливается бит 30 регистра ECX». Поэтому я не был уверен, что мне следует делать (ECX >> 30) & 1' или '(ECX >> 29) и 1' – 8protons

+0

@ 8protons, я думаю' ((ECX >> 29) & 1' будет –

+0

Мой плохой. Я перечитал руководство Intel и начал с бит ** 00 **, поэтому бит ** 30 ** действительно является 31-м битом и, следовательно, ((ECX >> 30) и 1) будет работать Спасибо – 8protons

Смежные вопросы