位操作符用于最基本的层次上,即按内存中表示的数值的位来操作数值。位操作符不能直接操作64位的值,而是先将64位的值转换为32位的整数,然后执行操作,最后转为64位。对于有符号的整数,32位中的前31位用于表示整数的值,第三十二位表示数值的符号,0表示正值,1表示负值。这个表示符号的位叫做符号位。
负数的同样是以二进制码存储,但使用的格式是二进制补码。计算一个熟知的二进制补码,需要经过三个步骤
1)求这个数值绝对值得二进制码(例如-18的二进制补码,先求18的二进制码)
求-18的二进制补码,首先求得18的二进制码,即
0000 0000 0000 0000 0000 0000 0001 0010
2)求二进制的反码,即将0,1互换;
1111 1111 1111 1111 1111 1111 1110 1101
3)最后,二进制反码加一;
1111 1111 1111 1111 1111 1111 1110 1101
1(进位)
1111 1111 1111 1111 1111 1111 1110 1110
在对NaN和Infinify值应用位操作符时,会被当做0处理。
按位非(~)
var num = 25;0000 0000 0000 0000 0000 0000 0001 1001
var num2 = ~num;
1111 1111 1111 1111 1111 1111 1110 0110(加一)
1111 1111 1111 1111 1111 1111 1110 0111(取反)
0000 0000 0000 0000 0000 0000 0001 1000(转换为10进制)
( 2的三次方加2的四次方 = 26 ;26加负号 )
alert(num2);//-26
这里对25执行按位非操作,得到了-26.验证了按位非操作的本质,操作数的负值减一。
因此以下代码也能得到相同结果。
var num = 25;
var num2 = -num -1;
alert(num2);//“-26”
按位与(&)
按位与操作在本质上来说就是将两个数值的每一位对齐,然后根据表中规则,执行and操作
第一位 | 第二位 | 结果 |
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 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
2的0次方 = 1
按位或(|)
第一位 | 第二位 | 结果 |
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
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
=27
按位异或(^)
第一位 | 第二位 | 结果 |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
var result = 25 ^ 3;
alert(result);//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
=26