c++ - 函数是否可以优化 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 个按位或,对吗?
据他们说,面试官期待进一步的优化。我很茫然地看到可能有进一步的优化。如果是这样,它们是什么?
解决方案
首先,这个函数将不起作用,甚至无法编译。如果我是面试官,你就没有机会通过考试。操作优先级有问题,一个班次方向错误。
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;
}
如果目标系统上可用,任何优化编译器都会将其转换为单个操作
您可以使用特定于编译器的内置插件,例如uint32_t __builtin_bswap32 (uint32_t x)
对于特定架构最有效的内置插件,并且尽管优化级别相同,但效率相同。
推荐阅读
- javascript - 如何在发布方法之前检查值?
- java - 从 JTable 获取对象
- javascript - 如何正确使用 .catch()?无法在某些代码中使用它
- sql - 如何在 SQL 中获得每个幼儿园最后三个成绩的平均值?
- html - 在表单 div 上添加 div 图像
- javascript - 为什么增加 setInterval 的延迟会导致它减少延迟?
- r - R 和 PostgreSQL - 预先指定可能的列名和类型
- javascript - 没有被重定向回 django 中更新的博客文章
- javascript - 单击按钮时如何制作引导表?
- python - 如何将熊猫时间序列 df 重新采样为代表某些测量值相等的新行?