Сравнение битовых полей разных размеров - PullRequest
7 голосов
/ 09 июня 2011

Что произойдет, если вы используете побитовый оператор (&, | и т. Д.) Для сравнения двух битовых полей разных размеров?

Например, сравнение 0 1 1 0 с 0 0 1 0 0 0 0 1:

0 1 1 0 0 0 0 0 The smaller one is extended with zeros and pushed to the
0 0 1 0 0 0 0 1 most-significant side.

Или ...

0 0 0 0 0 1 1 0 The smaller one is extended with zeros and pushed to the
0 0 1 0 0 0 0 1 least-significant side.

Или ...

0 1 1 0 The longer one is truncated from its least-significant side,
0 0 1 0 keeping its most significant side.

Или ...

0 1 1 0 The longer one is truncated from its most-significant side,
0 0 0 1 keeping its least-significant side.

Ответы [ 3 ]

7 голосов
/ 09 июня 2011

Битовые операторы всегда работают с продвинутыми операндами. То, что именно может произойти, может зависеть от того, подписано ли одно (или оба) битовых поля (поскольку это может привести к расширению знака).

Итак, для ваших примеров значений битовое поле с двоичным значением 0 1 1 0 будет преобразовано в int 6, а битовое поле с двоичным значением 0 0 1 0 0 0 0 1 будет преобразовано в int 33, и это те операнды, которые будут использоваться с любой операцией.

2 голосов
/ 09 июня 2011

Если вы на самом деле используете значения как битовые поля, что означает сравнение битовых полей разных размеров?Будет ли это для вас значимым результатом?

При этом оба операнда будут переведены в минимальный размер int / unsigned со знаком, в зависимости от подписи оригинальных операндов.Затем эти повышенные значения будут сравниваться с побитовым оператором.

Это ведет себя как ваш второй пример: меньший дополняется нулями на стороне MSB (толкается на сторону LSB, если вы предпочитаете).

Если один операнд подписан и отрицателен, а другой - без знака, отрицательный будет преобразован в конгруэнтное число без знака до выполнения битовой операции.

Если вместо целых чисел вы имеете в виду std::bitset,Вы не можете выполнять побитовые операции над наборами битов разных размеров.

1 голос
/ 09 июня 2011

0 0 0 0 0 1 1 0 Меньший из них расширяется нулями и сдвигается в наименее значимую сторону 0 0 1 0 0 0 0.

...