位移运算符
位移运算符 直接操作二进制数,运算速率更快。
-
按位非(not) 把1变成0,把0变成1 超出运算范围,变成负数
var a=25; var b=~a; b=?
25的 二进制数:00000000000011001
转化后: 11111111111100010
结果为:-26
总结非运算:一个数与自身的取反值相加等于-1。 此例中 25 与它的取反值-26 相加得1.
2)按位与&(and) 都为1得1,都为0得0,不同得0
var a=25 ; var b=a&3 b=??
25的 二进制数:00000000000011001
3的二进制数 :00000000000000011
结果:00001 结果为:1
与运算(&):两个二进制位中都为1,才返回1,否则返回0
3)按位或 | (or) 都为1得1,都为0得0,不同得1
var a=25 ; var b=a|3 b=??
25的 二进制数:00000000000011001
3的二进制数 :00000000000000011
结果:11011 结果为: 27
或运算(|):两个二进制位中只要有一个为1,就返回1,否则返回0
4)按位异或(xor) 都为1得0,都为0得0,不同得1
var a=25 ; var b=a|3 b=??
25的 二进制数:00000000000011001
3的二进制数 :00000000000000011
结果:11010 结果为:26
5)左移 << 负数运算操作补码 符号位不移动
左移:将一个数的二进制值向左移动指定的位数,尾数补0,即乘以2的指定次方(符号位不参与移动)。
例如1:
var a=2 ; var b=a<<5 b=??
2的进制数:00000000000000000000010
移走5位 : 000000000000000010{00000}
结果:64
例如2:
console.log(4 << 1); //8
//4的二进制形式为100,左移一位相当于1000,即十进制的8,相当于乘以2的1次方
console.log(-4 << 1); //-8 此例操作的负数的补码。用原码更简单
//-4的二进制形式是11111111111111111111111111111100(4的二进制形式减1再取反)
,左移一位得到11111111111111111111111111111000,
转换为十进制得到-8(减1后再取反)
6)右移 >> 负数运算操作 符号位不移动
右移:将一个数的二进制值向右移动指定位数,头部补0,即除以2的指定次方(符号位不参与移动)。
例如:
var a=64 ; var b=a>>5 b=??
64的进制数:000000000000000010{00000}
移走5位 : 00000000000000000000010
结果:2
右移就是:尾部删掉,符号为不变,前面0补齐。
console.log(4 >> 1); //2
console.log(-4 >> 1); //-2
7)无符号右移 >>> 尾数删掉0,前面补齐0 符号位也移动 所以总得到正值
无符号右移:该运算符表示将一个数的二进制形式向右移动,包括符号位也参与移动,头部补0,所以该运算总是得到正值。对于正数,该运算的结果与右移运算符(>>)完全一致,区别主要在于负数。
例子1:
var a=-64 ; var b=a>>>5 b=??
-64的进制数:11111111111111111111110{00000}
移走5位 : 00000011111111111111111111110
结果:134217726
整体右移,多余舍掉(符号位的1也舍掉)。前面用0补齐。
例子2:
console.log(-4 >>> 1); //2147483646
因为-4的二进制形式为11111111111111111111111111111100 整体右移一位,得到
01111111111111111111111111111110 ,转换为十进制得到2147483646。
查看一个负整数在计算机内部的储存形式,最快的方法就是使用这个运算符。
console.log(-1 >>> 0); //4294967295
上面代码表示,-1作为32位整数时,内部的存储形式使用无符号整数格式解读,值为4294967295(换为二进制为11111111111111111111111111111111)
共同学习,如果有问题,希望大家多多指正。