Являются ли битовые операции независимыми от порядка байт?
Пример.
int n = 1;
std::cout << (n & 1) << std::endl; // будет ли здесь 1 и на little-endian и на big-endian?
Ответы (1 шт):
Для начала проясним, что Little-endian и Big-endian задают порядок байт для представления многобайтового значения. Порядок бит внутри байта в обоих случаях одинаковый.
Например, упомянутое число 1 для 4х-байтного int
будет выглядеть в разных системах так:
Порядок байт | Число 1 в двоичном виде, младшие адреса слева |
---|---|
Big-endian | 00000000'00000000'00000000'00000001 |
Little-endian | 00000001'00000000'00000000'00000000 |
Далее, битовая операция &
(and) согласно определению даёт 1
на позиции результата, где оба операнда имеют единицу и 0
в противном случае. В частном случае, когда оба операнда одинаковые - X
, результат X & X
будет X
, независимо от порядка представления байт. Ведь оба операнда представлены в какой-то одной системе. Нельзя сказать, например, что левый операнд будет кодирован как big-endian, а правый как litte-endian.
Таким образом, для ситуации n = 1
, n & 1
всегда даст 1
.
Big-endian | Число в двоичном виде, младшие адреса слева |
---|---|
n | 00000000'00000000'00000000'00000001 |
1 | 00000000'00000000'00000000'00000001 |
n & 1 | 00000000'00000000'00000000'00000001 |
Little-endian | Число в двоичном виде, младшие адреса слева |
---|---|
n | 00000001'00000000'00000000'00000000 |
1 | 00000001'00000000'00000000'00000000 |
n & 1 | 00000001'00000000'00000000'00000000 |
Как и для любого нечётного n
.