我找到了一个小算法来确定一个数字是否是 2 的幂,但没有解释它是如何工作的,到底发生了什么?
var potence = n => n && !(n & (n - 1));
for(var i = 2; i <= 16; ++i) {
if(potence(i)) console.log(i + " is potence of 2");
}
我将解释它如何适用于非负数n
。第一个条件在n && !(n & (n - 1))
只是简单地检查n
不为零。如果n
不为零,那么它有一些最不重要的1
-位在某个位置p
。现在,如果你减去1
from n
, 位置之前的所有位p
将更改为1
,以及位p
将翻转到0
.
像这样的事情:
n: 1010100010100111110010101000000
n-1: 1010100010100111110010100111111
^ position p
现在,如果你&
这两个位模式,位置之后的所有内容p
保持不变,之前的一切(包括p
) 被清零:
after &: 1010100010100111110010100000000
^ position p
如果服用后的结果&
恰好为零,那么说明该位置之后没有任何东西p
,因此这个数字一定是2^p
,看起来像这样:
n: 0000000000000000000000001000000
n - 1: 0000000000000000000000000111111
n&(n-1): 0000000000000000000000000000000
^ position p
thus n
是一个幂2
。如果结果为&
不为零(如第一个示例中所示),则意味着在p
-th 位置,因此n
不是一个力量2
.
我懒得去玩这个负数的 2 补码表示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)