我看到了两种不同的方法来结合位移位和掩码,我想知道假设结果用作 bool 值时它们是否等效,或者是否一个比另一个问题更少或性能更好。
两个:
flags & (BIT_MASK << BIT_NUMBER)
或
(flags >> BIT_NUMBER) & BIT_MASK
前者似乎在某些平台上可能会出现问题,具体取决于 flags
的大小,即移位可能会将掩码推出临时变量的顶部。这是一个问题吗?升档与降档是否存在任何性能差异?
合并 BIT_MASK
和 BIT_NUMBER
合并到一个明确的掩码中再次让我印象深刻,但我正在处理遗留代码,我想尽量减少对其的更改。
最佳答案
flags & (BIT_MASK << BIT_NUMBER)
可以在一位指令中完成。
(flags >> BIT_NUMBER) & BIT_MASK
需要两条指令,一个移位后跟一个位与。
(实际上,在 PowerPC 上,第二个版本也有一个专用的操作码,rlwinm
,但英特尔没有这样的运气。)
当然,最大的区别在于它们生成不同的结果值。如果您只检查零或非零,那么我更喜欢第一个版本,因为它是一条指令。
关于c++ - 进行位移和掩码的最有效/正确的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14717497/