Битовые операторы и «порядковый номер» - PullRequest
64 голосов
/ 25 июня 2009

Имеет ли значение endianness вообще битовые операции? Либо логично , либо смещается?

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

В случае, если это имеет значение, я использую C.

Ответы [ 5 ]

68 голосов
/ 25 июня 2009

Порядковый номер имеет значение только для размещения данных в памяти. Как только данные загружаются обрабатываемым процессором, порядковый номер полностью теряет актуальность. Сдвиги, побитовые операции и т. Д. Выполняются так, как вы ожидаете (данные логически размещаются как младшие разряды в старшие) независимо от порядка следования.

61 голосов
/ 25 июня 2009

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

short temp = 0x1234;
temp = temp >> 8;

// on little endian, c will be 0x12, on big endian, it will be 0x0
char c=((char*)&temp)[0];

Чтобы уточнить, я не принципиально не согласен с другими ответами здесь.Я хочу подчеркнуть, что хотя побитовые операторы по существу нейтральны по порядку байтов, вы не можете игнорировать эффект байтовости в вашем коде, особенно в сочетании с другими операторами.

5 голосов
/ 25 июня 2009

Как уже упоминалось, сдвиги определяются спецификацией языка C и не зависят от порядкового номера, но реализация сдвига вправо может варьироваться в зависимости от того, используется ли архитектура с арифметикой дополнения или дополнения двух.

3 голосов
/ 12 июня 2012

Это зависит. Не переводя число в новый тип, вы можете прозрачно обращаться с порядком байтов.

Однако, если ваша операция включает в себя приведение нового типа, будьте осторожны.

Например, если вы хотите сдвинуть вправо некоторые биты и привести (явно или нет) к новому типу, порядок байтов имеет значение!

Чтобы проверить свой порядок байтов, вы можете просто привести int в char:

int i = 1;

char *ptr;

...

ptr = (char *) &i;  //Cast it here

return  (*ptr);
1 голос
/ 25 июня 2009

Вы не указали язык, но обычно языки программирования, такие как абстрактный абстракция C, отсутствуют в побитовых операциях. Так что нет, это не имеет значения в побитовых операциях.

...