位操作符用于在最基本的层次上,即按内存中表示的数值的位来操作数值,ECMAScript中所有数值都以IEEE-754 64位格式存储,但位操作符并不直接操作64位的值。而是先将64位的值转换成32位的整数,然后执行操作,最后再将结果转换回64位。对于开发人员来说,由于64位存储格式是透明的,因此整个过程就像是只存在32位的整数一样。
对于有符号的整数,32位中的前31位用于表示整数的值。第32位用于表示数值的符号:0表示整数,1表示负数。这个表示符号的位叫做符号位,符号位的值决定了其他位数值的格式。其中,正数以纯二进制格式存储,31位中的每一位都表示2的幂。
10010 => 2(4)*1 + 2(3)*0 + 2(2)*0 + 2(1)*1 + 2(0)*0 = 18
负数同样以二进制码存储,但是用的格式是二进制补码。计算一个数值的二进制补码,需要经过以下3个步骤:
1.求这个数值绝对值的二进制码
2.求二进制反码
3.得到的二进制反码加1
按位非(NOT)
按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码。按位非是ECMASsript操作符中少数几个与二进制计算有关的操作符之一。
var num = 25;
var num2 = ~num;
alert(num2); // -26
按位与(AND)
按位与操作符由一个和号字符(&)表示,它有两个操作符数。从本质上讲,按位与操作就是将两个数值的每一位对齐,然后根据规则(两个数值的对应位都是1时才返回1,其他都返回0),对相同位置上的两个数执行AND操作。
var r = 25 & 3;
alert(r); // 1
按位或(OR)
按位或操作符由一条竖线符号(|)表示,和按位与一样也是两个操作符数。从本质上讲,其将两个数值的每一位对齐,然后根据规则(两个数值的对应位都是0时才返回0,其他都返回1),对相同位置上的两个数执行OR操作。
var r = 25 | 3;
alert(r); // 27
按位异或(XOR)
按位异或操作符有一个插入符号(^)表示,也有两个操作符。规则(对应位相等返回0,不等返回1)
左移
左移操作符是由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定位数。
右移
右移操作符是由两个大于号(>>)表示,这个操作符会将数值的所有位向右移动指定位数。
左移带符号
左移操作符是由三个小于号(<<<)表示,这个操作符会将数值的所有位向左移动指定位数。
右移带符号
右移操作符是由三个大于号(>>>)表示,这个操作符会将数值的所有位向右移动指定位数。