与其余语言一样,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;};