操作符-位操作符
1.按位非(NOT)
按位非操作符由一个波浪线(~)表示,执行安慰非的结果就是返回数值的反码。按位非操作的本质:操作数的负值-1。
var num=25; var num2=~num1; alert(num2);//-26
2.按位与(AND)
按位与操作符由一个和号字符(&)表示,它有两个操作符数。
第一个数值的位 | 第二个数值的位 | 结果 |
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
简而言之,按位与操作只在两个数值的对应位置都是1时才返回1,任何一位是0,结果都是0;例如:
var result=25&3; alert(result);//1
为什么?下面是其的底层操作:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
--------------------------------------------------------
AND= 0000 0000 0000 0000 0000 0000 0000 0001
3.按位或(OR)
按位或操作符由一个竖线符号(|)表示,同样也有两个操作数。
第一个数值的位 | 第二个数值的位 | 结果 |
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
按位或操作在有一个位是1的情况下就返回1,而只有在两个位都是0的情况下才返回0;
如下例子对25和3执行按位或操作:
var result=25|3; alert(result);//27
底层的操作如下:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------
OR = 0000 0000 0000 0000 0000 0000 0001 1011
3.按位异或(XOR)
按位异或操作符由一个插入符号(^)表示,也有两个操作数。
第一个数值的位 | 第二个数值的位 | 结果 |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
按位异或与按位或的不同之处在于,这个操作在两个数值对应位上只有一个1时才返回1,如果对应的两位都是1或都是0,则返回0。
对25和3执行按位异或操作的代码如下:
var result=25^3; alert(result);//26
25与3按位异或的结果是26,其底层操作如下所示:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
--------------------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010
5.左移
左移操作符由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数。
var oldValue=2;//等于二进制的10 var newValue=oldValue << 5;//等于二进制的100000,十进制的64
在向左移位后,原数值的左侧多出5位空位。左移操作会以0来填充这些空位,以便得到的结果是一个完整的32位二进制数。
6.有符号的右移
有符号的右移操作由两个大于号(>>)表示,这个操作符将数值向右移动,但保留符号位(即正负号标记)。有符号的右移操作与左移操作恰好相反。
7.无符号右移
无符号右移操作符由3个大于号(>>>)表示,这个操作符将数值的所有32位都向右移动,对正位数来说,无符号右移的结果与有符号的右移相同。