位運算總結

Felix皇子發表於2020-11-07

位運算總結

191.位1的個數題解 位運算

  1. 按位與 &
    按位與運算將參與運算的兩數對應的二進位制位相與,當對應的二進位制位均為 1 時,結果位為 1,否則結果位為 0。
0000 0101 & 0000 1000 = 0000 0000

判斷奇偶:這是因為奇數的二進位制最低位始終為 1,而偶數的二進位制最低為始終為 0。所以,無論任何奇數與 1 即 0000 0001 相與得到的都是 1,任何偶數與其相與得到的都是 0。

if( 3 & 1) {
	// 奇數
} else {
	// 偶數
}
/*
0011 & 0001 = 0001 
0101 & 0001 = 0001
*/
  1. 按位或 |
    按位或運算將參與運算的兩數對應的二進位制位相或,只要對應的二進位制位中有 1,結果位為 1,否則結果位為 0。
0000 0011 | 0000 0111 = 0000 0111
  1. 按位異或 ^
    按位異或運算將參與運算的兩數對應的二進位制位相異或,當對應的二進位制位值不同時,結果位為 1,否則結果位為 0
0000 1100 ^ 0000 0111 = 0000 1011

變數交換

a = 3, b = 5
a = a ^ b
b = a ^ b
a = a ^ b
// 最後輸出 a = 5, b = 3
  1. 按位取反 ~
    按位取反運算將二進位制數的每一個位上面的 0 換成 1,1 換成 0.
// 數字 9 按位取反0000 1001
= 0000 1001  // 補碼,正數補碼即原碼
= 1111 1010  // 取反
= -10

// 數字 -20 按位取反0001 0100
= 1110 1011 + 1 // 負數的補碼 = 負數的絕對值取反 + 1
= 1110 1100 # 補碼
= 0001 0011 # 取反
= 19

由上可推出 -x = -(x + 1)

  1. 左移運算 <<
    左移運算將數對應的二進位全部向左移動若干位,高位丟棄,低位補 0
5 << 4
= 0000 0101 << 4
= 0101 0000 // 高位丟棄,低位補 0
= 80  // 等價於 5 * 2^4 = 5 * 16 = 80

左移運算 x << n = x(2)^n
6. 右移運算 >>
右移運算將數對應的二進位全部向右移動若干位。對於左邊的空位,如果是正數則補 0,負數可能補 0 或 1

80 >> 4
= 0101 0000 >> 4
= 0000 0101 // 正數補0,負數補1 
= 5

右移運算正好是左移的逆運算,即 x >> n = x ÷ (2)^n

取 x 的第 k 位

// 即取數字 x 對應的二進位制的第 k 位上的二進位制值。假設數字為 5,其對應的二進位制為 0000 0101,取第 k 位二進位制值的位運算為 x >> k & 1
x = 5 // 0000 0101
for(let i = 0; i< 8; i++){
	console.log( x >> i & 1)
}
// 1 0 1 0 0 0 0 0

這裡也體現了一點,位運算子的優先順序 >> 大於 & 的優先順序

  1. 位掩碼

相關文章