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 的二進制表示為:

(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;
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM