关于JS位运算的几点说明

一:提要:

位运算:左移都是一样的,右移分为2种情况:有符号位右移和无符号位右移(无符号位又分为正数和负数的右移,这2不一样,本文就负数的右移做详细说明)

二:说明如下:

<1>在左移数位时,数字右边多出 5 个空位。左移运算用 0 填充这些空位,使结果成为完整的 32 位数字。左移运算保留数字的符号位。例如,如果把 -2 左移 5 位,得  到的是 -64,而不是 64。“符号仍然存储在第 32 位中吗?”是的,不过这在 ECMAScript 后台进行,开发者不能直接访问第 32 个数位。即使输出二进制字符串形式的     负数,显示的也是负号形式(例如,-2 将显示 -10。)

<2>有符号位右移的时候,就是用符号位的值来填充右移之后的空位。表示方法:>>

Eg:var i=64>>5

alert(i)//i输出为2

<3>无符号位右移的时候,表示方法:>>>

对于正数,和有符号位右移的运算法则一样。Eg:var i=64>>>5

alert(i)//i输出为2;

对于负数无符号右移,

var i = -17>>>0;//注意这里,如果不写>>>0的话,toString(2)则会直接输出-17的二进制-10001(JS表示负数的特殊之处,详见本文蓝色注解),写了>>>0表     示同等情况下的补码,0表示还没有移位,如果是4,表示右移4位,然后高位用0补齐,所以无符号负数右移会是一个很大的正数(因为空位虽然用0补齐位数,但是非空位  的第一个肯定是1,而一般不写toString(2)最后的显示结果,也会用补码转化成10进制来显示)

//详解:-17(10)=   11111111 11111111 11111111 11101111(-17的补码)

//-17〉〉〉4 = 00001111 11111111 11111111 11111110 = 268435454(高位补0,低位移出丢掉)

alert(i.toString(2));

三:蓝色注解:

var i = 18;

var j = -18;

alert(i.toString(2));//显示10010

alert(j.toString(2));//显示-10010,而且所有整数字面量都默认存储为有符号整数,只有用JS的位运算符才能创建无符号整数。二进制位运算,JS的特殊之处

posted on 2013-08-27 09:34  鸣动我心  阅读(699)  评论(0编辑  收藏  举报