JS的位运算符“与”(&)及应用
与其他语言一样,JS也有位运算符,这里介绍一下“&”,及其一个简单的应用:
“&”的运算方法:两个数值的个位分别相与,同时为1才得1,只要一个为0就为0。
如下表表示:
a | b | 结果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
判断一个正整数是否为偶数
我们就可以利用 & 的运算特性,来判断一个数是否为偶数。
我们知道,如果一个正整数是偶数,那么它的二级制表示的最低为一定不能是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的幂,原理如下:
假设 n 的二进制表示为(a10...0)₂,其中 a 表示若干个高位,1 表示最低位的那个 1,0...0 表示后面的若干个 0,那么 n−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 出现在偶数的位置,否则说明其出现在奇数的位置。
或者用16进制表示,使其更美观:
那么在判断的时候就可以用以下判断是否为偶数:
var isPowerOfFour = function(n) {
return n > 0 && (n & (n - 1)) === 0 && (n & 0xaaaaaaaa) === 0;
};