这个reverseBytes方法是如何工作的?

Cha*_*les 2 c byte bit-shift bit

我在网上查看这个功能,想知道它是如何工作的:

   /*
    * reverseBytes - reverse bytes
    *   Example: reverseBytes(0x12345678) = 0x78563412
    *   Legal ops: ! ~ & ^ | + << >>
    */
    int reverseBytes(int x)
    {
        int newbyte0 = (x >> 24) & 0xff;
        int newbyte1 = (x >> 8) & 0xff00;
        int newbyte2 = (x << 8) & 0xff0000;
        int newbyte3 = x << 24;

        return newbyte0 | newbyte1 | newbyte2 | newbyte3;
    }
Run Code Online (Sandbox Code Playgroud)

这是我认为我理解的:

  • 0xff0xff00、 和0xff0000二进制分别是1111 11111111 1111 0000 0000、 和1111 1111 0000 0000 0000 0000
  • 该方法使用掩码( 等)创建四个新字节0xff,然后使用|运算符将​​它们的值加在一起

我真的不明白这是如何反转字节的。我希望得到详细的解释。谢谢!

nos*_*nos 5

该代码假定为 32 位整数和 8 位字节。32 位整数由 4 个字节组成:假设这 4 个字节在内存中的布局如下:

+---------------------------------+
|Byte 4 | Byte 3 | Byte 2 | Byte 1|
+---------------------------------+
Run Code Online (Sandbox Code Playgroud)

这可能与给定 CPU 类型的字节顺序有关。当解释由多个字节组成的整数时,某些 CPU 系列会将最左边的字节(内存地址较低的字节)视为整数的最高有效字节 - 这种 CPU 称为大端字节序。其他 CPU 会做相反的事情,它们会将整数中最右边的字节(具有最大内存地址的字节)视为最高有效字节 - 小端 CPU。因此,您的函数将整数从一种字节序转换为另一种字节序。

int newbyte0 = (x >> 24) & 0xff;
Run Code Online (Sandbox Code Playgroud)

这需要上面描述的整数(4个字节),将其右移24位,并屏蔽除低8位之外的所有内容,newbyte0现在看起来像这样,其中字节4是原始字节4和其他x3个字节将所有位设置为零。

+---------------------------------+
|  0    |  0    |   0    | Byte 4 |
+---------------------------------+
Run Code Online (Sandbox Code Playgroud)

同样地

 int newbyte1 = (x >> 8) & 0xff00;
Run Code Online (Sandbox Code Playgroud)

将位向右移动 8 位,并屏蔽除左侧字节中的 8 位以外的所有内容。结果如下所示,原始值仅剩余字节 3x

+---------------------------------+
|  0    |  0    |  Byte 3 |   0   |
+---------------------------------+
Run Code Online (Sandbox Code Playgroud)

最左边的 2 个字节的处理方式类似,只是x左移以完成相同的操作。

最后你有

 newbyte0 | newbyte1 | newbyte2 | newbyte3;
Run Code Online (Sandbox Code Playgroud)

它结合了您上面创建的所有整数,每个整数仅保留原始 8 位x。对它们进行按位运算or,你最终会得到

+---------------------------------+
|Byte 1 | Byte 2 | Byte 3 | Byte 4|
+---------------------------------+
Run Code Online (Sandbox Code Playgroud)