與其他語言一樣,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;
};