快速搞懂位元運算子的 XOR

Roan
Apr 16, 2023

--

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

之前介紹過 「&」符號,也就是 AND,本文介紹「^」,也就是 XOR。

圖片來源:BlueWillow
圖片來源:BlueWillow

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

const X = 21
const Y = 3
console.log(X ^ Y) // 22

只能有一個 1

首先,進行 XOR 運算前,還是要把十進位數字改成二進位數字。

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

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

根據 W3School 的定義,兩個數字只能其中一者有 1,若兩者都是 1 ,則在 XOR 的運算後也是 0,因此得出以下表格:

前述程式碼的 21 與 3 經過二進位換算後分別為:10101 與 00011,X^Y 的運算過程如下:

將 10110 轉回十進位數字就是 22。

之前的文章已說明位元運算子的 AND,其他位元運算子除了運算的規則有差異之外,運算過程(先把數字改為十進位再進行運算)也都一樣,相信各位讀者能快速理解本篇文章。

補充:如何消除成雙的數字,只留下單一數字

這是 LeetCode 的題目:https://leetcode.com/problems/single-number/

題目要求寫出函式,刪除陣列中成雙的數字,只留下單一的數字。例如有個陣列是:[2,2,3,1,3],必須刪除成雙的 2 與 3,只留下 1。解法如下:

function singleNumber(nums) {
let result = 0;
for (let i = 0; i < nums.length; i++) {
result ^= nums[i];
}

return result;
}

此函式會針對陣列中每個數字進行 XOR 運算,由運算過程中發現只要是重複的數字,在運算的過程中會互相抵銷(即使出現順序不一樣),最後剩下單一數字。以下是此函式的運算過程:

「本次 result」,到了下一次時就是「上次 result」,為了方便辨識所以用顏色標記。

由 0 開始,每次 XOR 運算後的結果再對下一個數字進行 XOR 運算,最後得到結果為 01。

相關文章

快速搞懂位元運算子的 AND

--

--

Roan

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