c++ - 进行位移和掩码的最有效/正确的方法是什么?

标签 c++

我看到了两种不同的方法来结合位移位和掩码,我想知道假设结果用作 bool 值时它们是否等效,或者是否一个比另一个问题更少或性能更好。

两个:

flags & (BIT_MASK << BIT_NUMBER)

(flags >> BIT_NUMBER) & BIT_MASK

前者似乎在某些平台上可能会出现问题,具体取决于 flags 的大小,即移位可能会将掩码推出临时变量的顶部。这是一个问题吗?升档与降档是否存在任何性能差异?

合并 BIT_MASKBIT_NUMBER合并到一个明确的掩码中再次让我印象深刻,但我正在处理遗留代码,我想尽量减少对其的更改。

最佳答案

flags & (BIT_MASK << BIT_NUMBER)可以在一位指令中完成。

(flags >> BIT_NUMBER) & BIT_MASK需要两条指令,一个移位后跟一个位与。

(实际上,在 PowerPC 上,第二个版本也有一个专用的操作码,rlwinm,但英特尔没有这样的运气。)

当然,最大的区别在于它们生成不同的结果值。如果您只检查零或非零,那么我更喜欢第一个版本,因为它是一条指令。

关于c++ - 进行位移和掩码的最有效/正确的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14717497/

相关文章:

c++ - 如何将信息从启动器传递到我的程序?

c++ - 错误 LNK2019 : unresolved external symbol Visual Studio 2013 with openCV

c++ - 尝试从表单运行线程

c++ - Vulkan: `vkFlushMappedMemoryRanges` 线程层错误?

c++ - 将自定义类(继承 QObject)传递给 QML 的最佳方法是什么?

python - xtensor 类型的性能与 NumPy 的简单归约

c++ - 相同类型重新定义的 Clang typedef(和别名)导致意外错误

c++ - 如何在类定义中初始化 vector 成员变量?

c++ - 如何在 C++ 中打印二维数组?

c++ - 方法调用后字节大小不正确