что означает следующее выражение в с ++ - PullRequest
1 голос
/ 20 сентября 2011

Что означает следующее выражение в c ++?

(variable1 | (variable2 << 8))

Что это значит? И что это представляет?

Ответы [ 8 ]

9 голосов
/ 20 сентября 2011

Объединяет две переменные.
Предположим, у вас есть два символа: a и b. a|b<<8 сдвигает b 8 бит влево, | устанавливает каждый бит в a или b.
Так что в этом примере результат будет "ab".

«a» равно 97, «b» равно 98, поэтому поразрядно происходит следующее:

<code>a:      01100001
b:              01100010
b<<8:   0110001000000000
a|b<<8: 0110001001100001
7 голосов
/ 20 сентября 2011

| равно Побитовое ИЛИ
<< is Оператор сдвига влево по битам

   (variable1 | (variable2 << 8))

Влево Смещает variable2 (8 бит) на 8, а затем OR s результат с variable1 (8 бит), в результате выходной результат будет объединять две переменные variable1 и variable2, которые должны быть представлены как одна переменная (16 бит).

3 голосов
/ 20 сентября 2011

Вы можете думать об этом как о "конкатенации" двух переменных поразрядным образом.

Если:

x = 00000000 00001000 (16-bit binary)
y = 00000000 00100010 (16-bit binary)

Тогда:

    (y << 8) = 00100010 00000000
x | (y << 8) = 00100010 00001000

Что это на самом деле означает в контексте кода, в котором вы нашли, это чье-то предположение.


На самом деле, «сцепление» не является точным, если x имеет какие-либо биты, установленные всамый старший байт:

Если:

x = 01000000 00001000 (16-bit binary)
y = 00000000 00100010 (16-bit binary)

Тогда:

    (y << 8) = 00100010 00000000
x | (y << 8) = 01100010 00001000
1 голос
/ 20 сентября 2011

Это имело бы смысл, если бы обе переменные были байтами.В этом случае он объединит их в одну большую переменную, так что сначала идут 8 битов переменной2, а затем 8 битов переменной1.

0 голосов
/ 20 сентября 2011

В вашем коде 8 младших значащих (крайних правых) битов variable1 добавляются к битам variable2 справа, а биты variable2 сдвигаются влево на 8.

Если обозначить биты variable1 как

xxxxxxxxxxxxxxxxxxxxxxxxwxxxxxxx

и биты variable2 как

yyyyyyyyzyyyyyyyyyyyyyyyyyyyyyyy

тогда выражение

(variable1 | (variable2 << 8))

приведет к

zyyyyyyyyyyyyyyyyyyyyyyywxxxxxxx
0 голосов
/ 20 сентября 2011

Если variable1 и variable меньше 256, оператор такой же, как variable1 + (variable2*256).

В более общем смысле, | является двоичным или или и << остаетсяshift.

Итак, если мы начнем с:

variable1 = 321;
variable2 = 123;

Двоичные значения будут:

variable1 =>  0000 0001 0100 0001
variable2 =>  0000 0000 0111 1011

Сдвиг влево variable2 на 8 приводит к:

              0111 1011 0000 0000

То есть variable1 | (variable2 << 8) равно

              0111 1011 0100 0001

, что равно 32065. Это меньше, чем 31519, что является результатом (321 + (123 * 256)), потому что variable1 и variable2 << 8 имеют некоторые общие черты.

0 голосов
/ 20 сентября 2011

Я не знаю, что вы подразумеваете под "значением" - но это одна переменная, которая побитово ИЛИ с другой переменной, смещенной влево на 8 бит (которую вы можете считать умноженной на 256).

0 голосов
/ 20 сентября 2011

Если variable1 и variable1 являются 8-битными значениями, то он объединяет их в одно 16-битное значение.

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