Javascript支持位操作,如 & ,| , ^ , ~, 分别为与、或、异或、非操作。此外还有移位操作。
这里主要对移位操作进行说明。在看书学习Javascript的过程中多次把位操作尤其是移位操作给略过,今天做一套笔试题,发现里面有不止一道位操作的题,潜下心看了看。
位运算符是在数字底层(即表示数字的32个数位)进行操作的
无符号整数把最后一位作为另一个数位处理。
在有符号整数中,第0-30位为数值位,第31位为符号位。负数存储为二进制补码。(以我的知识判断,其实所有的数包括正数也是以二进制补码的形式存储的,只不过正数的原码和补码相同罢了)
求负数补码的过程:原码——>符号位不变,其他位取反得到反码——>再加1得到补码
有趣的是,把负整数转换成二进制字符串后,ECMAScript 并不以二进制补码的形式显示,而是用数字绝对值的标准二进制代码前面加负号的形式输出。
例如:
- var iNum = -18;
- alert(iNum.toString(2));//输出 “-10010”
左移运算(<<),它把数字中的所有数位向左移动指定的数量。左移时,数字右边的空位用0填充。
例如,
- var iOld = 2;//二进制10
- 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”来填充填充。因此,对于正数,无符号右移运算的结果与有符号右移运算一样。
转载于:https://blog.51cto.com/kaixinbocai/1151307