关于JS中的位操作,它比较底层的,通过它JS可以直接操作内存中数值的位。
关于整数在计算机中的二进制表示方式:
有符号整数的前31位表示数值,第三十二位表示符号位,0表示正数,1表示负数。每一位都是2的幂。
5的表示方式就是101。2 * 2的2次幂 + 0 * 2的一次幂 + 1 * 2的0次幂 = 5;
而-5在计算机中的表示方式是二进制补码。计算过程如下:
1. 算出5的二进制码(101);
2. 再计算反码(010);
3. 再加1得到二进制补码(011)
所以-5在计算机种的表示方式就是011,当然在0之前还省略了29个1。
JS中的位操作符:
1. 按位非 ~
求出数值的反码,32位中的1变成0,0变成1。
var num1 = 5; // 二进制101
var num2 = ~num1; // 二进制010,十进制-6
所以可以看出,反码就是原数值的相反数再减一。
2. 按位与 &
位与需要两个操作数,它们按位对齐,遵循如下规则:
Num1 Num2 结果
1 1 1
1 0 0
0 1 0
0 0 0
需要两个位都是1,结果才是1。
例子:var num1 = 5; // 二进制101
var num2 = 4; // 二进制100
num1 & num2; // 结果100,十进制的话还是4
3. 按位或 |
位或也需要两个操作数,其规则如下:
Num1 Num2 结果
1 1 1
1 0 1
0 1 1
0 0 0
只要有一位是1,结果就是1。都是0结果才是0。
3. 按位异或 ^
异或也需要两个操作数,起规则如下:
Num1 Num2 结果
1 1 0
1 0 1
0 1 1
0 0 0
位或的规则就是两个位不一样时返回1,一样时返回0。
4. 左移 <<
左移操作符会让数值的位都翔移动指定的位数。左移之后,右侧会出现空位,这时候由0来填充。
var num = 2; // 二进制10
num << 2; // 左移两位,二进制1000,十进制8
5. 有符号右移 >> 和 无符号右移 >>>
右移操其实有两种情况:
1. 对于有符号的右移,在右移过程中,最左边的符号位始终不会移动,所以空白位都是出现在符号位的右侧,并且会用符号位的数字填充空白位。
00000...000001000
↑
符号位
右移两位之后:
2个空白位
↓
00000...000000010
↑
符号位
2. 对于无符号的右移,这个过程会将所以的32位都向右移动。对于正数而言,因为符号位是0,所以两种右移结果相同。但是负数是以二进制补码的方式存 在,而无符号右移操作会认为是整数的二进制码,所以这两种右移操作对于负数的结果不一样。
var num = -5; // 二进制111111...111011
num >>> 2; // 二进制11111...111110,十进制1073741822