【问题标题】:Fastest (Optimized) way to swap bytes of a 32 bit value [duplicate]交换32位值字节的最快(优化)方法[重复]
【发布时间】: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 编译器(及其版本)及其实现的优化。如果您发现需要最快的方法,我建议您在汇编程序中编写代码(例如,bswap x86 指令正是您想要的)。
  • 对于 x86,您可以在一条指令 BSWAP 中执行此操作 - 使用编译器内在函数或内联 asm 从 C 代码执行此操作。见:stackoverflow.com/a/105371/253056
  • byteorder.h 在我的 cygwin gcc 4.8.3 中对 ntohl/htonl 使用 bswap,除非参数是编译时常量(在这种情况下,该值是在编译时使用位移位计算的)。同样,要做的是使用经过验证的现有技术。

标签: c linux swap endianness


【解决方案1】:

如果htonlntohl 功能可用并且满足您的需求,您可以考虑使用它。否则,搜索各种方法,分析这些方法并选择最快的一种。例如,也可以尝试在 gcc 中使用任何编译器提供的函数 __builtin_bswap32

一个例子取自here,经过轻微修改。

register uint32_t value = number_to_be_reversed;
uint8_t lolo = (value >> 0) & 0xFF;
uint8_t lohi = (value >> 8) & 0xFF;
uint8_t hilo = (value >> 16) & 0xFF;
uint8_t hihi = (value >> 24) & 0xFF;

uint32_t value = (hihi << 24)
               | (hilo << 16)
               | (lohi << 8)
               | (lolo << 0);

【讨论】:

  • 我认为是 32 位的 htonl/ntohl。
  • @PeterSchneider 谢谢,我打错了短版本。
猜你喜欢
  • 1970-01-01
  • 2014-08-05
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 2014-06-08
相关资源
最近更新 更多