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

标签 c linux swap endianness

<分区>

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

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

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

最佳答案

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

关于c - 交换 32 位值字节的最快(优化)方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27796047/

相关文章:

c - 尝试修改字符串时出现段错误

c - GDB 与 pthreads

linux - 如何测试用crontab部署的脚本

linux - 为什么这段代码会随着地址随机化而崩溃?

c - void swap(int *a, int *b) 不适用于数组

c - 知道为什么这段代码没有并行运行

c - 程序运行后退出?

linux - 所有者无法在具有所有 Linux 权限的文件夹中创建文件

2 列表元素的 Pythonic 交换

c++ - vector - 当元素有 const 成员时交换两个元素