移位運算子、邏輯運算、位元運算

電腦位元運算,移位運算子將數值的二進位表示法向左或向右移動的位數,以達到乘除以 2 的冪次方或取得某些位元的效果。邏輯運算表示處理布林值 True & False 的運算,邏輯運算有且 AND、或 OR、非 NOT 和異或 XOR

移位運算子 Bitwise Operator <<, >> 對二進位數的邏輯運算操作。不帶符號數、移位運算子將資料看成二進位制數向指定位方向移動,溢位的部分將被捨棄,而空缺的部分填入 0 值。

var decimalA = 1; // 二進位 0000000000000001
var decimalB = 2; // 二進位 0000000000000010
var decimalC = 3; // 二進位 0000000000000011
var binaryTotal = decimalA << 6; // 1 << 6 = 64

decimalA 向左移位 6 結果得到 64 二進位表示如下。

0000000001000000

var result = decimalB << 3; // 2 << 3 = 16

接著將 decimalB 向左移位 3 結果得到 16 二進位表示如下。

0000000000010000

Bitwise 位元 OR 運算,比較兩個數,然後回傳一個新的數,只要對應的二個二進位有一個為 1 時,結果位就為 1。否則為 0。JavaScript 使用 | 操作數被轉換為 32 位整數。超過 32 位的數字將被丟棄其最高有效位。

binaryTotal = binaryTotal | result;  // 64 | 16 = 80

結果得到 80 二進位表示如下。

0000000001000000  // 64
0000000000010000  // 16
0000000001010000  // 80

var result = decimalC << 0; // 3 << 0 = 3

decimalC 向左移位 0 結果得到 3 二進位表示如下。0 等於沒有移位。

0000000000000011  // 3
binaryTotal = binaryTotal | result;  // 80 | 3 = 83
0000000001010011  // 83

這樣使用移位運算子 <<|1, 2, 3 放入一組二進位,結果得到了十進位 83



取回原本的數值

var binaryTotal = 83;

Bitwise 位元 AND 運算,比較兩個數,然後回傳一個新的數,只有對應的兩個二進位均為 1 時,結果位才為 1,否則為 0。JavaScript 使用 & 操作。結果得到 3 二進位表示如下。

var result3 = binaryTotal & 7  // 83 & 7 = 3
0000000001010011  // 83
0000000000000111  // 7
0000000000000011  // 3

這樣使用 AND 運算,result3 已經取回原本的 3。其中因範例只用三位所以使用 7 三位最大為 111


接著將 binaryTotal >> 向右移位 3 結果得到 10,就是溢出 011 將他推出去。

var result = binaryTotal >> 3  // 10

result = 10 二進位表示如下。

0000000000001010  // 10

var result2 = result & 7  // 10 & 7 = 2
0000000000001010  // 10
0000000000000111  // 7
0000000000000010  // 2

同樣使用 AND 運算,result2 已經取回原本的 2


0000000000001010  // 10

接著再次 result >> 向右移位,將 010 推出去。

var result1 = result >> 3  // 10 >> 3 = 1
0000000000000001

result1 已經取回原本的 1


以上只是二進位,移位運算子、邏輯運算、位元運算的模擬計算不存在意義。