Являются ли битовые операции независимыми от порядка байт?

Пример.

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.

→ Ссылка