我该怎么做 - 两个快速的mod功率就像一个快速的++功率?

时间:2012-11-09 19:08:01

标签: c++ performance optimization bit-manipulation bitwise-operators

我保留一个索引计数器,表示应该像圆形数组一样。我强制大小为2的幂,因此使用size_t MASK = size_ - 1以便在遍历时替换模数:

index_ = (++index_) & MASK;

但问题是,在我的情况下,我有时会意识到我可以重用我下次在这里发布的那个索引,所以当发生这种情况时我会有这样的事情:

if (canReuseLastUsedIndex())
    --index_;

但是当最后一个抛出index_为零时,这会崩溃,因为它没有回绕到size_(即MASK+1)。有这种方法可以让这种情况发生吗?还是什么东西很快? (即最好不要说:if (index_) --index_; else index_ = size_

2 个答案:

答案 0 :(得分:6)

您可以执行相同的操作并对其进行位掩码:

index_ = (index_ - 1) & MASK;

这是有效的,因为无符号下溢在C和C ++中定义良好。

请注意,这行代码是未定义的行为

index_ = (++index_) & MASK;

因为你在序列点之间不断修改变量index_(在预增量和赋值中)。

答案 1 :(得分:1)

你已经在做了。只需应用MASK和添加相同的内容:

index_ = (index_ - 1) & MASK;