首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >寻找负数的2的下一个幂

寻找负数的2的下一个幂
EN

Stack Overflow用户
提问于 2016-06-04 04:10:15
回答 1查看 153关注 0票数 0

嘿,伙计们,我正在做计算2的下一个幂的研究,偶然发现了一个代码,看起来像这样:

代码语言:javascript
运行
复制
int x;//assume that x is already initialized with a value
--x;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x+1;

当我运行正数时,它运行得很好,但它不适用于负数,因为我不理解负数,因为我认为,从寻找2的下一个幂的角度来看,一个数字是正还是负并不重要。如果我们有数字5,我们想要找到2的下一个幂。如果我们直观地思考它,我们知道它是8,因为8大于5,8与2^3相同。如果我尝试使用负数,我总是得到0,我不明白,因为0不是2的幂

EN

回答 1

Stack Overflow用户

发布于 2016-06-04 07:17:40

简短的答案是因为C++标准规定,对于负值,由>>运算符产生的值是由实现定义的,而对于正值,它的结果是除以2的幂。

过于简单地说,术语“定义的实现”意味着标准允许结果在不同的实现之间变化,即在编译器之间变化。在其他事情中,这意味着不能保证它将以与正值相同的方式运行(对于正值,行为是明确指定的)。

原因是signed int的表示也是由实现定义的。例如,这允许使用二进制补码表示法-这(尽管有时会使用其他表示法)在实践中非常常用。

从数学上讲,二进制补码中的右移相当于除以2的幂,并向下舍入到-infinity,而不是零。对于正值,向零和向-infinity四舍五入具有相同的效果(零和-infinity都小于任何正整数值)。对于负值,它们不会(四舍五入是远离零,而不是接近零)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37622597

复制
相关文章

相似问题

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