黑铁时代
Programing is not only one kind of technology, but also one kind of art.

关于JS中的位操作,它比较底层的,通过它JS可以直接操作内存中数值的位。

 

关于整数在计算机中的二进制表示方式:

有符号整数的前31位表示数值,第三十二位表示符号位,0表示正数,1表示负数。每一位都是2的幂。

  5的表示方式就是101。2 * 2的2次幂 + 0 * 2的一次幂 + 1 * 2的0次幂 = 5;

  而-5在计算机中的表示方式是二进制补码。计算过程如下:

    1. 算出5的二进制码(101);

    2. 再计算反码(010);

    3. 再加1得到二进制补码(011)

  所以-5在计算机种的表示方式就是011,当然在0之前还省略了29个1。

 

JS中的位操作符:

1. 按位非 ~

  求出数值的反码,32位中的1变成0,0变成1。

  var num1 = 5; // 二进制101

  var num2 = ~num1; // 二进制010,十进制-6

  所以可以看出,反码就是原数值的相反数再减一。

 

2. 按位与 &

  位与需要两个操作数,它们按位对齐,遵循如下规则:

    Num1  Num2  结果

    1    1    1

    1    0    0

    0    1    0

    0    0    0

  需要两个位都是1,结果才是1。

  例子:var num1 = 5; // 二进制101

    var num2 = 4; // 二进制100

    num1 & num2; // 结果100,十进制的话还是4

 

3. 按位或 |

  位或也需要两个操作数,其规则如下:

    Num1  Num2  结果

    1    1    1

    1    0    1 

    0    1    1

    0    0    0

  只要有一位是1,结果就是1。都是0结果才是0。

 

3. 按位异或 ^

  异或也需要两个操作数,起规则如下:

    Num1  Num2  结果

    1    1    0

    1    0    1

    0    1    1

    0    0    0

  位或的规则就是两个位不一样时返回1,一样时返回0。

 

4. 左移 <<

  左移操作符会让数值的位都翔移动指定的位数。左移之后,右侧会出现空位,这时候由0来填充。

    var num = 2; // 二进制10

    num << 2; // 左移两位,二进制1000,十进制8

 

5. 有符号右移 >> 和 无符号右移 >>>

  右移操其实有两种情况:

    1. 对于有符号的右移,在右移过程中,最左边的符号位始终不会移动,所以空白位都是出现在符号位的右侧,并且会用符号位的数字填充空白位。

      00000...000001000

      ↑

      符号位

      右移两位之后:

      2个空白位

         ↓

      00000...000000010

      ↑

      符号位

    2. 对于无符号的右移,这个过程会将所以的32位都向右移动。对于正数而言,因为符号位是0,所以两种右移结果相同。但是负数是以二进制补码的方式存      在,而无符号右移操作会认为是整数的二进制码,所以这两种右移操作对于负数的结果不一样。

     var num = -5; // 二进制111111...111011

     num >>> 2; // 二进制11111...111110,十进制1073741822

posted on 2012-06-05 21:57  黑铁时代  阅读(571)  评论(0编辑  收藏  举报