【发布时间】:2015-03-03 23:10:48
【问题描述】:
我需要交换 32 位值 11223344 的字节,应将其交换为 44332211。 目前我正在使用以下逻辑。
val = ((((val) & 0xff000000) >> 24)|
(((val) & 0x00ff0000) >> 8) |
(((val) & 0x0000ff00) << 8) |
(((val) & 0x000000ff) << 24));
这是按预期工作的。但我只是想知道是否有其他最快/优化的方法可以做到这一点。
【问题讨论】:
-
这是瓶颈吗?
-
我希望 htonl resp。 ntohl(取决于您的平台)编译器的宏定义将是最佳的,参见。 linux.die.net/man/3/ntohl
-
您可能最终使用的任何“优化”C 代码都会使您的代码高度依赖于您的特定 C 编译器(及其版本)及其实现的优化。如果您发现需要最快的方法,我建议您在汇编程序中编写代码(例如,
bswapx86 指令正是您想要的)。 -
对于 x86,您可以在一条指令 BSWAP 中执行此操作 - 使用编译器内在函数或内联 asm 从 C 代码执行此操作。见:stackoverflow.com/a/105371/253056
-
byteorder.h 在我的 cygwin gcc 4.8.3 中对 ntohl/htonl 使用 bswap,除非参数是编译时常量(在这种情况下,该值是在编译时使用位移位计算的)。同样,要做的是使用经过验证的现有技术。
标签: c linux swap endianness