移位运算

课后整理 2020-12-20

移位运算就是对二进制值进行有规律移位,移位运算可以设计很多奇妙的效果,这在图形图像编程中应用比较广泛。

【示例1】把数字5向左移动2位,则返回值为20。

alert(5<<2);                        // 返回值20

如果用算式图进行演示则如图2.8所示。

图2.8  把5向左位移2位运算

在移位运算过程中,如果右侧空出的位置,则JavaScript自动使用0进行填充,确保整个值是一个完整的32位二进制值。在左移操作中,符号位始终保持不变。在位移过程中,如果超出32位的值将自动被丢弃。

右移运算包含有符号和无符号两种形式。有符号右移运算与左移运算操作相反,它把32位数字中的所有有效位整体右移。移位后的空位位于有效位的左侧,但是位于符号位的右侧,此时JavaScript会使用符号位的值来填充空位。移动过程中超出的值将被自动丢弃。

【示例2】把数值1000向右移8位,则返回值为3。

alert(1000>>8);                     // 返回值3

如果用算式图进行演示则如图2.9所示。

图2.9  把1000向右位移8位运算

【示例3】把数值-1000向右移8位,则返回值为-4。

alert(-1000>>8);                    // 返回值-4

如果用算式图进行演示则如图2.10所示。你可以看到当符号位值位1时,则有效位左侧的空位全部使用1进行填充。

图2.10  把-1000向右位移8位运算

对于无符号右移,可以使用>>>运算符来表示,它将把无符号的32位整数所有数位整体右移。对于无符号或正数右移运算,则无符号右移与有符号右移运算的结果是相同的。

【示例4】下面两行表达式的返回值都是相同的。

alert(1000>>8);                     // 返回值3
alert(1000>>>8);                     // 返回值3

【示例5】对于负数来说,无符号右移将使用0来填充所有的空位,同时会把负数看做正数来处理。所以所得的结果一般都会非常大。

alert(-1000>>8);                    // 返回值-4
alert(-1000>>>8);                    // 返回值16777212

如果用算式图进行演示则如图2.11所示。左侧的空位就不再用符号位的值来填充,而是用0来填充。

图2.11  把-1000向右无符号位移8位运算

在执行运算时,JavaScript会把这个数值转换为无符号的等价形式,尽管第32位是一个符号位,但是此时会把它看做一个数值位进行运算。所以,在使用无符号右移运算符时,要特别小心,避免出现意想不到的错误。