求 2 次幂的算法

2024-04-23

我找到了一个小算法来确定一个数字是否是 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(使用前将#替换为@)

求 2 次幂的算法 的相关文章