首页 > 解决方案 > 函数是否可以优化 int32 中的字节顺序?

问题描述

我认识的人最近在一次编程面试中被问到这个问题。他们被要求在reverseBytes下面写一个函数,如果你通过它,0xabcdef12它就会输出0x12efcdab

他们给出了以下解决方案。

unsigned int reverseBytes (unsigned int x) {
  unsigned int ans = 0;
  ans = ((x & 0xff000000) >> 24) | ((x & 0x00ff0000) >> 8) |   ((x & 0x000000ff) << 24) |  ((x & 0x0000ff00) << 8);   
  return res;
}

有没有进一步优化的方法?一个人当然不能做第一个和第三个掩码,但他们仍然需要做至少 2 个位掩码操作、4 个按位移位和 3 个按位或,对吗?

据他们说,面试官期待进一步的优化。我很茫然地看到可能有进一步的优化。如果是这样,它们是什么?

标签: c++optimizationbit-manipulationbitwise-operatorsbit-shift

解决方案


首先,这个函数将不起作用,甚至无法编译。如果我是面试官,你就没有机会通过考试。操作优先级有问题,一个班次方向错误。

int不一样int32_t

uint32_t reverseBytes (int32_t y) {
  int32_t ans = 0;
  uint32_t x = y;
  ans = ((x & 0xff000000) >> 24) | ((x & 0x00ff0000) >> 8) |   ((x & 0x000000ff) << 24) |  ((x & 0x0000ff00) << 8);   
  return ans;
}

如果目标系统上可用,任何优化编译器都会将其转换为单个操作

https://godbolt.org/z/5fWbGT

您可以使用特定于编译器的内置插件,例如uint32_t __builtin_bswap32 (uint32_t x)对于特定架构最有效的内置插件,并且尽管优化级别相同,但效率相同。


推荐阅读