最快(优化)的方式来交换32位值的字节

时间:2015-01-06 09:50:37

标签: c linux swap endianness

我需要交换32位值的字节11223344应交换为44332211。 目前我正在使用以下逻辑。

val = ((((val) & 0xff000000) >> 24)|
      (((val) & 0x00ff0000) >>  8) |
      (((val) & 0x0000ff00) <<  8) |
      (((val) & 0x000000ff) << 24));

这是按预期工作的。但我只是想知道是否还有其他最快/最优化的方法来做同样的事情。

1 个答案:

答案 0 :(得分:0)

如果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);