与其他语言一样,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的幂,原理如下:
假设 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;
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。