Целое число без знака в порядке байтов

Возможный дубликат:
конвертировать большой или прямой порядок байтов в C [без использования предоставленной функции]

У меня возникли проблемы с этой одной частью: если я хотел взять 32-битное число, и я хочу сместить его байты (1 байт = 8 бит) из формы с прямым порядком байтов в форму с прямым порядком байтов. Например:

Допустим, у меня есть номер 1.

В 32 битах это выглядит так:

1st byte 2nd byte 3rd byte 4th byte
00000000 00000000 00000000 00000001

Я хочу, чтобы это выглядело так:

4th byte 3rd byte 2nd byte 1st byte
00000001 00000000 00000000 00000000

так что байт с наименее значимым значением появляется первым. Я думал, что вы можете использовать цикл for, но я не совсем уверен, как сдвигать биты / байты в C ++. Например, если пользователь ввел 1, и мне пришлось сдвинуть его биты, как в примере выше, я не уверен, как бы я преобразовал 1 в биты, а затем сдвинул. Кто-нибудь может указать мне правильное направление? Спасибо!

2

Решение

<< а также >> это операторы побитового сдвига в C и большинстве других языков стиля C.

Один из способов сделать то, что вы хотите, это:

int value = 1;
uint x = (uint)value;
int valueShifted =
( x << 24) |                // Move 4th byte to 1st
((x << 8) & 0x00ff0000) |  // Move 2nd byte to 3rd
((x >> 8) & 0x0000ff00) |  // Move 3rd byte to 2nd
( x >> 24);                 // Move 4th byte to 1st
4

Другие решения

uint32_t n = 0x00000001;
std::reverse( (char*)&n, (char*)(&n + 1) );
assert( n == 0x01000000 );
2

Сдвиг делается с << а также >> операторы. Вместе с побитовым И (&) и ИЛИ (|операторы вы можете делать что хотите:

 int value = 1;
int shifted = value << 24 | (value & 0x0000ff00) << 8 | (value & 0x00ff0000) >> 8 | (value & 0xff000000) >> 24;
0