交换 32 位值字节的最快(优化)方式
Fastest (Optimized) way to swap bytes of a 32 bit value
我需要交换一个 32 位值的字节 11223344 应该交换为 44332211。
目前我正在使用以下逻辑。
val = ((((val) & 0xff000000) >> 24)|
(((val) & 0x00ff0000) >> 8) |
(((val) & 0x0000ff00) << 8) |
(((val) & 0x000000ff) << 24));
这是按预期工作的。但我只是想知道是否还有其他 fastest/Optimized 方法可以做到这一点。
如果htonl
和ntohl
功能可用并且适合您的需要,您可以考虑使用它。否则搜索各种方法,分析这些方法并选择最快的方法。例如,也可以尝试在 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 位值的字节 11223344 应该交换为 44332211。 目前我正在使用以下逻辑。
val = ((((val) & 0xff000000) >> 24)|
(((val) & 0x00ff0000) >> 8) |
(((val) & 0x0000ff00) << 8) |
(((val) & 0x000000ff) << 24));
这是按预期工作的。但我只是想知道是否还有其他 fastest/Optimized 方法可以做到这一点。
如果htonl
和ntohl
功能可用并且适合您的需要,您可以考虑使用它。否则搜索各种方法,分析这些方法并选择最快的方法。例如,也可以尝试在 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);