与其他语言一样,JS也有位运算符,这里介绍一下“&”,及其一个简单的应用:

“&”的运算方法:两个数值的个位分别相与,同时为1才得1,只要一个为0就为0。
如下表表示:

ab结果
111
100
010
000

判断一个正整数是否为偶数

我们就可以利用 & 的运算特性,来判断一个数是否为偶数。
我们知道,如果一个正整数是偶数,那么它的二级制表示的最低为一定不能是1,所以,可以与1进行&运算,如果为0,则说明最低为为0,就是偶数。

var isEven = function(n) {
    return n > 0 && (n & 1) === 0;
};

判断一个数是否为2的幂

一个数 n 是 2 的幂,当且仅当 n 是正整数,并且 n 的二进制表示中仅包含 1 个 1。
与上面判断偶数的思路相似,我们也可以用 & 运算来测试。

这里有个技巧是可以用n & (n - 1)来进行检测,一个数是否是2的幂,原理如下:
假设 nn 的二进制表示为 (a10...0)₂ ,其中 a 表示若干个高位,1 表示最低位的那个 1,0...0 表示后面的若干个 0,那么 n−1 的二进制表示为:(a01...1)₂

我们将 (a10...0)₂ (a01...1)₂ 进行按位与运算,高位 a 不变,在这之后的所有位都会变为 0,这样我们就将最低位的那个 1 移除了。移除之后,如果不为0,那么表示整个二级制数不止一个1,所以就肯定不是2的幂,反之,如果为0,整个二级制数只有一个1,则为2的幂。

因此,如果 n 是正整数并且 n & (n - 1) = 0,那么 n 就是 2 的幂。
故判断一个数是否为2的幂可用如下方法进行判断:

var isPowerOfTwo = function(n) {
    return n > 0 && (n & (n - 1)) === 0;
};

判断一个数是否为4的幂

根据数学知识我们知道如果一个数是4的幂,那么它必然是2的幂,而且在此基础上,它的二进制表示必然所有的1都在偶数位上。

我们假设数字为使用32位二进制表示的正整数,即 n <= 2^31 - 1。

我们可以构建一个整数 mask ,它的所有偶数二进制位都是 0,所有奇数二进制位都是 1。这样一来,我们将 n 和 mask 进行按位与运算,如果结果为 0,说明 n 二进制表示中的 1 出现在偶数的位置,否则说明其出现在奇数的位置。

mask=(10101010101010101010101010101010)₂

或者用16进制表示,使其更美观:

mask=(AAAAAAAA)₁₆

那么在判断的时候就可以用以下判断是否为偶数:

var isPowerOfFour = function(n) {
    return n > 0 && (n & (n - 1)) === 0 && (n & 0xaaaaaaaa) === 0;
};

这个少年有点热丶
363 声望12 粉丝

[链接]