首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我怎么做-- ++ 2的幂,就像1快速地修改2的幂一样?

我怎么做-- ++ 2的幂,就像1快速地修改2的幂一样?
EN

Stack Overflow用户
提问于 2012-11-10 03:08:01
回答 2查看 184关注 0票数 0

我保留了一个索引计数器,它应该表现得像一个循环数组。我强制大小是2的幂,因此在像这样遍历时使用size_t MASK = size_ - 1来替换模数:

代码语言:javascript
运行
复制
index_ = (++index_) & MASK;

但问题是,在我的情况下,我有时意识到我可以重用下一次在这里分发的索引,所以当这种情况发生时,我有如下的东西:

代码语言:javascript
运行
复制
if (canReuseLastUsedIndex())
    --index_;

但是,当最后抛出的index_为零时,它就崩溃了,因为它没有绕到size_ (即MASK+1)。有没有什么办法可以做到这一点呢?或者一些非常快的东西?(例如,最好不要说:if (index_) --index_; else index_ = size_)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-10 03:10:27

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

代码语言:javascript
运行
复制
index_ = (index_ - 1) & MASK;

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

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

代码语言:javascript
运行
复制
index_ = (++index_) & MASK;

因为您在序列点之间多次修改变量index_ (在前增量和赋值中)。

票数 6
EN

Stack Overflow用户

发布于 2012-11-10 03:10:40

你已经在这么做了。只需像使用did时一样简单地应用MASK

代码语言:javascript
运行
复制
index_ = (index_ - 1) & MASK;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13314365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档