移位运算子、逻辑运算、位元运算

电脑位元运算,移位运算子将数值的二进位表示法向左或向右移动的位数,以达到乘除以 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


以上只是二进位,移位运算子、逻辑运算、位元运算的模拟计算不存在意义。