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

标签 c byte bit bit-shift

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

   /*
    * 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;
    }

这是我认为我理解的:

  • 0xff0xff000xff0000二进制为1111 11111111 1111 0000 0000 1111 1111 0000 0000 0000 0000
  • 该方法创建四个带有掩码(0xff 等)的新字节,然后使用| 运算符将它们的值相加

不过我真的不明白这是如何反转字节的。我将不胜感激详细的解释。谢谢!

最佳答案

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

+---------------------------------+
|Byte 4 | Byte 3 | Byte 2 | Byte 1|
+---------------------------------+

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

int newbyte0 = (x >> 24) & 0xff;

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

+---------------------------------+
|  0    |  0    |   0    | Byte 4 |
+---------------------------------+

同理

 int newbyte1 = (x >> 8) & 0xff00;

将位向右移动 8 位,并从左侧屏蔽掉第 2 个字节中除 8 位以外的所有内容。结果看起来像这样,原始值 x 只剩下字节 3

+---------------------------------+
|  0    |  0    |  Byte 3 |   0   |
+---------------------------------+

最左边的 2 个字节处理类似,只是将 x 左移以完成相同的事情。

终于有了

 newbyte0 | newbyte1 | newbyte2 | newbyte3;

它结合了您在上面创建的所有整数,每个整数都只剩下原始 x 的 8 位。对它们执行按位 or,最后得到

+---------------------------------+
|Byte 1 | Byte 2 | Byte 3 | Byte 4|
+---------------------------------+

关于c - 这个 reverseBytes 方法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28471907/

相关文章:

c - 符号扩展 C 中的九位数字

objective-c - 如何在 objective-c 中将字节值转换为 int

c# - 使用 C# 将字节转换为图像时出现 "parameter is not valid"

python - 如何在 Python 3 中将二进制转换为字节再转换为十六进制?

c++ - 将 8 个位置的 int 数组转换为 char

c - C代码的优化

c++ - 如何将标准输出重定向到 Windows 应用程序中的某个可见显示?

c++ - 是否有人将 Maven/NAR 用于任何大型 C/C++ 项目?

从 IEEE754 浮点格式读取字节的正确方法

c - 内存字长异常的 "char*"(Knuth 的 MIX 架构)