Javascript支持位操作,如 & ,| , ^ , ~, 分别为与、或、异或、非操作。此外还有移位操作。

这里主要对移位操作进行说明。在看书学习Javascript的过程中多次把位操作尤其是移位操作给略过,今天做一套笔试题,发现里面有不止一道位操作的题,潜下心看了看。

 

    位运算符是在数字底层(即表示数字的32个数位)进行操作的

    无符号整数把最后一位作为另一个数位处理。

    在有符号整数中,第0-30位为数值位,第31位为符号位。负数存储为二进制补码。(以我的知识判断,其实所有的数包括正数也是以二进制补码的形式存储的,只不过正数的原码和补码相同罢了)

    求负数补码的过程:原码——>符号位不变,其他位取反得到反码——>再加1得到补码

    有趣的是,把负整数转换成二进制字符串后,ECMAScript 并不以二进制补码的形式显示,而是用数字绝对值的标准二进制代码前面加负号的形式输出。

例如:

 
  
  1. var iNum = -18; 
  2. alert(iNum.toString(2));//输出 “-10010” 

 

左移运算(<<),它把数字中的所有数位向左移动指定的数量。左移时,数字右边的空位用0填充。

例如,

 
  
  1. var iOld = 2;//二进制10 
  2. var iNew = iOld << 5;//二进制10 00000 十进制64 

 

有符号右移运算(>>)

它把32位数字中的所有数位整体右移,同时保留该数的符号。移动时,数字左侧的空位用符号位的值填充。

 

例:

13 >> 2 = 3

1101  -> 11

 

-13 >> 2 = -4

解释:

10000000 00000000 00000000 00001101(原码) -> 11111111 11111111 11111111 11110010(反码) -> 11111111 11111111 11111111 11110011(补码) -> 

11111111 11111111 11111111 11111100 -> 11111111 11111111 11111111 11111011 (反码) ->

10000000 00000000 00000000 00000100(原码) 十进制为-4 

无符号右移运算(>>>)

它把32位数字中的所有数位整体右移。移动时,数字左侧的空位用“0”来填充填充。因此,对于正数,无符号右移运算的结果与有符号右移运算一样。