javascript位运算符

平时对于javascript的位运算符使用极少,这几天在看zepto.js的源代码,发现里面有不少位运算符的使用,由于位运算在运算速度方面的优势,而且能够极大程度的节省内存,学习一下还是挺不错的。

javascript中的整数

ECMAScript中的整数分为两种:无符号整数和有符号整数(允许表示正数和负数)。在ECMAScript中默认的整数字面量都是有符号整数,有符号整数用第32位来表示正负(0表示正数,1表示负数),数值范围从 -2147483648 到 2147483647。

可以用toString(2)方法来获取二进制值,比如:

Number(18).toString(2) => '10010'

这里只会得到18对应二进制的前五位,因为其他位已经不重要了。

负数的二进制存储采用的形式是二进制补码,计算二进制补码的步骤为:

1、得到负数绝对值的二进制表示

2、求得该二进制的反码,即0变为1,1变为0

3、在该二进制反码的基础上+1

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

Number(-18).toString => '-10010'

javascript为了避免访问第31位(下标从0开始),用一种简单的方法来表示负数。

另外,无符号整数把第31位当作一个正常的数字来处理。

注意所有整数字面量都默认存储为有符号整数。只有 ECMAScript 的位运算符才能创建无符号整数。

 

位运算NOT

位运算在javascript中用(~)来表示,它是ECMAScript中为数不多的二进制运算符。

为运算符的三个计算步骤:

1、转化为二进制表示

2、把该二进制转为它的反码

3、反转回浮点数

位运算 NOT 实质上是对数字求负,然后减 1,因此 25 变 -26。

 

位运算AND

位运算由(&)连接,它是一个二目运算符,AND位运算的步骤如下:

1、将(&)符两边的浮点数转化为二进制

2、将各个位数上的数进行与操作

3、将新得到的二进制转为浮点数

 

位运算OR

位运算由(|)连接,它是一个二目运算符,AND位运算的步骤如下:

1、将(&)符两边的浮点数转化为二进制

2、将各个位数上的数进行或操作

3、将新得到的二进制转为浮点数

 

位运算XOR

位运算 XOR 由符号(^)表示,当然,也是直接对二进制形式进行运算。XOR 不同于 OR,当只有一个数位存放的是 1 时,它才返回 1。

 

左移运算

左移运算用(<<)来表示,它把数字中的所有位数都往左移动制定的位数,左移的时候右边的位数空出来的用0填充。

注意:左移运算不会改变第31位数。

 

有符号右移运算

有符号右移运算符由两个大于号表示(>>),它把32位数向右移动制定位数,同是保留该数的符号。

无符号右移运算

无符号右移运算用(>>>)表示,对于正数,无符号右移运算的结果与有符号右移运算一样。

无符号右移运算用 0 填充所有空位。对于正数,这与有符号右移运算的操作一样,而负数则被作为正数来处理。

由于无符号右移运算的结果是一个 32 位的正数,所以负数的无符号右移运算得到的总是一个非常大的数字。例如,如果把 -64 右移 5 位,将得到 134217726。如何得到这种结果的呢?

要实现这一点,需要把这个数字转换成无符号的等价形式(尽管该数字本身还是有符号的),可以通过以下代码获得这种形式:

var iUnsigned64 = -64 >>> 0;

然后,用 Number 类型的 toString() 获取它的真正的位表示,采用的基为 2:

alert(iUnsigned64.toString(2));

这将生成 11111111111111111111111111000000,即有符号整数 -64 的二进制补码表示,不过它等于无符号整数 4294967232。

 

javascript中对于(this.length >>> 0)运算有一个特殊的作用,Github问了 lifesinger给出了一个this.length >>> 0 的作用更简易的总结

  • 所有非数值转换成0
  • 所有大于等于 0 数取整数部分
posted @ 2013-11-18 16:48  耳敏  阅读(1274)  评论(0编辑  收藏  举报