嘿,伙计们,我正在做计算2的下一个幂的研究,偶然发现了一个代码,看起来像这样:
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的幂
发布于 2016-06-04 07:17:40
简短的答案是因为C++标准规定,对于负值,由>>
运算符产生的值是由实现定义的,而对于正值,它的结果是除以2的幂。
过于简单地说,术语“定义的实现”意味着标准允许结果在不同的实现之间变化,即在编译器之间变化。在其他事情中,这意味着不能保证它将以与正值相同的方式运行(对于正值,行为是明确指定的)。
原因是signed
int的表示也是由实现定义的。例如,这允许使用二进制补码表示法-这(尽管有时会使用其他表示法)在实践中非常常用。
从数学上讲,二进制补码中的右移相当于除以2的幂,并向下舍入到-infinity,而不是零。对于正值,向零和向-infinity四舍五入具有相同的效果(零和-infinity都小于任何正整数值)。对于负值,它们不会(四舍五入是远离零,而不是接近零)。
https://stackoverflow.com/questions/37622597
复制相似问题