位元運算子是用於處理二進位數字的運算符號。這些運算符號通常用於程式語言中,並對二進位數字進行操作。
之前介紹過 「&」符號,也就是 AND,本文介紹「^」,也就是 XOR。
並搭配以下 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 運算,由運算過程中發現只要是重複的數字,在運算的過程中會互相抵銷(即使出現順序不一樣),最後剩下單一數字。以下是此函式的運算過程:
由 0 開始,每次 XOR 運算後的結果再對下一個數字進行 XOR 運算,最後得到結果為 01。