Возможный дубликат:
конвертировать большой или прямой порядок байтов в 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 в биты, а затем сдвинул. Кто-нибудь может указать мне правильное направление? Спасибо!
<<
а также >>
это операторы побитового сдвига в 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
uint32_t n = 0x00000001;
std::reverse( (char*)&n, (char*)(&n + 1) );
assert( n == 0x01000000 );
Сдвиг делается с <<
а также >>
операторы. Вместе с побитовым И (&
) и ИЛИ (|
операторы вы можете делать что хотите:
int value = 1;
int shifted = value << 24 | (value & 0x0000ff00) << 8 | (value & 0x00ff0000) >> 8 | (value & 0xff000000) >> 24;