
JS按位操作符(Bitwise operators)
做什么的?
将其操作数(operands)当作 32位的比特序列(由0和1组成), 按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。
所有的按位操作符的操作数都会被转成补码(two’s complement)形式的有符号32位整数。
- 32位的比特序列
ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数)。在 ECMAScript 中,所有整数字面量默认都是有符号整数;
有符号整数使用 31 位表示整数的数值 (数值位),用第 32 位表示整数的符号 (符号位),0 表示正数,1 表示负数。

- 原码/反码/补码
1 | /* |
- 优劣势
直接对二进制数值进行运算,属于较为底层的运算,运算速度快,但是同样,可读性差
家庭成员
1 |
|
按位逻辑操作符
操作规则:
- 操作数被转换成32位整数,用比特序列(0和1组成)表示,超过32位的数字会被丢弃。
- 第一个操作数的每个比特位与第二个操作数的相应比特位匹配,逐位运算
按位与 &
规则:1/1得1,否则为0
1 | // 1的二进制表示为: 00000000 00000000 00000000 00000001 |
按位或 |
规则:0/0得0,否则为1
1 | // 1的二进制表示为: 00000000 00000000 00000000 00000001 |
按位非 ~
规则:0 -> 1, 1 -> 0
1 | // -1的二进制表示为: 11111111 11111111 11111111 11111111 |
按位异或 ^
规则:相同得0,不同得1
1 | // 1的二进制表示为: 00000000 00000000 00000000 00000001 |
按位移动操作符
操作规则:
- 两个操作数,第一个是被移动的数字,第二个是移动的长度
左移 <<
规则:将第一个操作数向左移动指定的位数。向左被移出的位被丢弃,右侧用 0 补充,符号位保留
1 | 9 (base 10): 00000000000000000000000000001001 (base 2) |
有符号右移 >>
规则:将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,拷贝最左侧的位以填充左侧。由于新的最左侧的位总是和以前相同,符号位没有被改变。所以被称作“符号传播”。
1 | // 9 >> 2 |
无符号右移 >>>
规则:将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。即便右移 0 个比特,结果也是非负的。
1 | //对于非负数,>> 和 >>> 结果一致 |
用途
- & 判断奇偶
1 | // n & 1 = 0 ,n为偶数 |
- ~, >>, <<, >>>, | 取整
1 | console.log(~~ 9.99) // 9 -(-(x + 1) + 1) |
(有坑!!!)
>>>判断正负
1 | x === x >>> 0 // true 非负数 |
- ^ 交换变量值
1 | let a = 5 |