1、左移运算
左移运算由两个小于号表示(<<)。它把数字钟的所有数位向左移动指定的数量。例如,把数字2左移5位没结果为64(等于二进制中的1000000)。
var iOld = 2; //二进制位10
var iNew = iOld << 5; //二进制位1000000 等于 64
注意,在左移数位时,数字右边多出5个空位。左移运算用0填充这些空位,使结果为完整的32位数字。
左移操作保留数字的符号位。例如,如果把-2左移5位,得到的是-64,而不是64。需要注意的是,符号(二进制中的第32位)仍然存储在第32位中。上面代码2的左移详解如下:
0000 0000 0000 0000 0000 0000 0000 0010 = 2
0000 0000 0000 0000 0000 0000 0100 0000 左移5位(空白处由0补充) = 64
2、有符号右移运算
有符号右移运算符由两个大于号(>>)表示,它把32位数字中的所有数位整体右移,同时保留该数字的符号(正号或负号)。有符号右移运算恰好与左移运算相反。例如,把64右移5位,将变为2:
var iOld = 64; //二进制为:1000000
var iNew = iOld >> 5; //二进制为:10 ,结果为2
同样,移动数位后会造成空位。空位位于数字的左侧,但位于符号位(二进制的第32位)之后。空位使用符号位填充:(就是说如果二进制第32位是1,那么空位都由1填充,反之雷同。)
0000 0000 0000 0000 0000 0000 0100 0000 = 64
0000 0000 0000 0000 0000 0000 0000 0010 = 2
3、无符号右移运算
无符号右移由三个大于号(>>>)表示,它将把无符号 32位数中的所有数位整体右移。对于整数,无符号右移运算的记过与有符号由于运算一样。用有符号右移运算的中例子,把64右移5位,将变为2。对于负数, 情况就不同了。无符号右移运算用0填充所有空位。对于整数,这与有符号右移运算的操作完全一样,而负数则被作为整数来处理。由于无符号右移运算的记过是一 个32位的正数,所以负数的无符号右移运算得到的总是一个非常大的数字,例如把-64右移5位,其结果为134217726。
要实现这一点,需要把这个数字转换成无符号的等价形式(尽管该数字是有符号或有负号的),可以通过以下代码获得这种形式:
var iUnsigned64 = -64 >>> 0;
然后,用Number类型的toString()方法获取它的真正的位表示,采用的基数为2: alert(iUnsigned64.toString(2));
这将生成:1111 1111 1111 1111 1111 1111 1100 0000,既有符号整数-64的二进制补码表示,不过它等于无符号整数4294967232.处于这种原因,使用无符号右移运算符要小心。
转载于:https://blog.51cto.com/kuiba/831342