移位运算就是对二进制值进行有规律移位,移位运算可以设计很多奇妙的效果,这在图形图像编程中应用比较广泛。
【示例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位是一个符号位,但是此时会把它看做一个数值位进行运算。所以,在使用无符号右移运算符时,要特别小心,避免出现意想不到的错误。