快速搞懂位元運算子的 AND

Roan
4 min readApr 13, 2023

--

位元運算子是用於處理二進位數字的運算符號。這些運算符號通常用於程式語言中,並對二進位數字進行操作。

本文先說明如何理解其中的「&」符號,也就是 AND。

圖片來源:StockAI

並搭配以下 JavaScript 程式碼作為範例逐步講解:

const X = 24
const Y = 3
console.log(X & Y) // 0

首先將數字轉為二進位

首先要注意的是,位元運算子僅用於二進位位元上。二進位的數字只有 1 與 0。

我們平常生活中用的數字,例如前面的 24 與 3 ,就是十進位;轉換成二進位後,分別是 11000 與 11。

這裡有十進位數字與二進位數字的轉換器:
https://tools.yeecord.com/calculator/dec/bin

這裡有解釋十進位數字如何轉為二進位:
http://www.chwa.com.tw/TResource/VS/book1/ch2/2-5.htm

更精確地來說,數字總共有32位,所以 24 應該是:

00000000000000000000000000011000

而 3 應該是:

00000000000000000000000000000011

但前面的眾多 0 因為計算時用不到,所以可以省略。把 11000 與 11 拿來比較的話,只要把 11 前面補滿成為 00011 使兩者的位數一樣,就可以到下一步計算了。

接著使用 AND

根據 W3School 的定義,兩個數字共同的位數都必須是 1,經過 AND 後才能是 1,否則就是 0。

可以整理出以下表格:

根據以上表格的比較方式,比較 11000 與 00011,結果如下:

結果便是 X&Y = 00000,也就是 0。

總結以上,要理解位元運算子 & (AND),首先把數字轉換為二進位,再經過 AND 比較,就能得到 AND 後的結果。

補充:如何判斷數字是否為 2 的次方

這是 LeetCode 的題目:https://leetcode.com/problems/power-of-two/description/

題目要求寫出函式,以判斷數字 n 是不是 2 的次方。

var isPowerOfTwo = function(n) {
if((n > 0) && (n & (n - 1)) == 0){
return true
}else{
return false
}
};

其中的 ( n & (n-1)) 就是將 n 與 (n-1) 進行 AND 的換算。可以發現如果 n 是 2 的次方,則轉換成二進位後只會有一個 1 ,且 1 在最左邊,其他都是 0。例如 2 就是 10、4 就是 100、8 就是 1000 (可以使用前面提到的轉換計算機計算)。

在 n 是 2 的次方的情況下,(n-1) 轉換為二進位後,數字位數必定少於 n。例如 16 轉為二進位後是 10000、 15則是 01111 (與 16 比較的話要補足前面的0,所以1111 變成 01111), 10000 & 01111 後就是 0。

因此,上述程式碼的意思就是:當 n 大於 0,且 n 與 n-1 經過位元運算子 AND 的計算後也是 0 ,則回傳 true,表示 n 是 2 的次方。

--

--

Roan

Javascript/HTML/CSS/React/Node.JS 我是光頭工程師