C 用于从大端到小端转换的优化代码

C 用于从大端到小端转换的优化代码,c,optimization,endianness,C,Optimization,Endianness,在一次采访中,我被要求将big_to_little_endian()实现为一个宏。我使用移位运算符实现了。但是面试官希望我进一步优化这个。我做不到。后来我在谷歌上搜索,但没找到。有人能帮助理解如何进一步优化此代码吗 #define be_to_le (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24)) #define

在一次采访中,我被要求将big_to_little_endian()实现为一个宏。我使用移位运算符实现了。但是面试官希望我进一步优化这个。我做不到。后来我在谷歌上搜索,但没找到。有人能帮助理解如何进一步优化此代码吗

#define be_to_le (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24))

#define be_to_le(((x)>>24)|(((x)&0x00FF0000)>>8)|((x)&0x0000FF00)他可能指的是使用16位运算交换最上面的两个字,然后使用8位运算交换其中的字节——保存了两条指令,这在联合中最容易完成,尽管C技术上不喜欢(但许多编译器都会接受),它仍然依赖于编译器,因为您希望编译器能够优化以下几项:

union dword {
  unsigned int i;
  union shorts {
    unsigned short s0, s1;
    union bytes {
      unsigned char c0, c1, c2, c3;
    } c;
  } s;
};

union dword in = (union dword)x;
union dword temp = { x.s.s1, x.s.s0 };
union dword out = { temp.s.c.c1, temp.s.c.c0, temp.s.c.c3, temp.s.c.c2 };
甚至不是有效的C,但你明白了(我认为编译器甚至不会发出我所希望的东西)

或者,您可以保存一个op,但引入了数据依赖关系,因此运行速度可能较慢

temp = (x << 16) | ( x >> 16)
out = ((0xff00ff00 & temp) >> 8) | (0x00ff00ff & temp) << 8)
temp=(x>16)

输出=((0xff00ff00&temp)>>8)|(0x00ff00ff&temp)在我看来不错。也许他正在寻找一些ASM“shuffle”指令来使用?一个好的编译器是否应该已经这样做了?旁白:与其重新发明轮子,还不如使用你的平台提供的或同等工具。你可能在写下答案后礼貌地补充了这一点:)显示使用编译器内部函数的最快方式。