2

可能重复:
在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 转换为位,然后移位。谁能指出我正确的方向?谢谢!

4

3 回答 3

4

<<并且>>是 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
于 2012-11-30T20:26:40.050 回答
2
uint32_t n = 0x00000001;
std::reverse( (char*)&n, (char*)(&n + 1) );
assert( n == 0x01000000 );
于 2012-11-30T20:28:48.697 回答
0

移位是用<<and>>运算符完成的。与按位 AND ( &) 和 OR ( |) 运算符一起,您可以做您想做的事情:

 int value = 1;
 int shifted = value << 24 | (value & 0x0000ff00) << 8 | (value & 0x00ff0000) >> 8 | (value & 0xff000000) >> 24;
于 2012-11-30T20:30:20.763 回答