一、JS中的位操作符有7种:
1. 按位取反 ~
2. 按位与 &
3.按位或 |
4.按位异或 ^
5.左移 <<
6.有符号右移 >>
7.无符号右移 >>>
运算中,所有的二进制都是补码。
1. 按位取反 ~
代码段:
var num1=25; //二进制补码00000000000000000000000000011001
var num2=~num1;//二进制补码11111111111111111111111111100110
alert(num2);//-26
2. 按位与 &
代码段:
var a=6&2;//0110&0010=0010
alert(a);//2
3.按位或 |
代码段:
var a=6 | 8;
alert(a);//14
4.按位异或 ^
代码段:
var a=6^15;
alert(a);//9
5.左移 <<
全部都是保留符号位的
2<<5==64 -2<<5==-64
6.有符号右移 >>
保留符号位,并且符号位的值填充所有产生的空位
var a=-6>>1;
alert(a);//-3
求解过程:
-6的原码:1 1 1 0
-6的反码:1 0 0 1
-6的补码:1 0 1 0
-6>>1 : 1 1 0 1(结果的补码,减一取反即可得到结果的原码)
-1 : 1 1 0 0
~ : 1 0 1 1(这是原码,a=-3)
var a=-6>>2;
alert(a);//-2
求解过程:
-6的补码:1 0 1 0
-6>>2 : 1 1 1 0(结果的补码,减一取反即可得到结果的原码)
-1 : 1 1 0 1
~ : 1 0 1 0(这是a的原码,a=-2)
7.无符号右移 >>>
包括符号位的共32位都往右移,0填充所有右移产生的空位。一般负数>>>的结果往往是非常大的正数,因为符号位变成了0。正数无影响。比如,-64>>5是一个很大的数134217726
二、总结
1.所有的二进制操作数都是补码,
2.有符号右移的过程是: 十进制数(操作数)->二进制原码 ->二进制补码 ->右移得到的二进制补码->二进制原码 -> 十进制数(右移结果)。