js按位运算符(按位或,按位与,按位异或)
1. 按位操作的概念:
按位操作为, 将数据转化为二进制八位展示/十六位展示后根据条件进行计算的操作
2. 按位运算符分类:
&: 按位与
|: 按位或
^: 按位异或
~: 按位非
<<: 左移运算符
>>: 右移运算符
>>>: 无符号右移
3. 具体讲解:
&: 按位与 ---- 将数据变为二进制后每一位数字进行 “与” 的操作, 按位对比,1, 1 -> 1, 其余均为0
例:console.log(1 & 3) // 1
分别转换为2进制 1 ---> 00000001
3 ---> 00000011
按照与的操作 结果 00000001 -> 对应10进制的 1
(1,1 -> 1, 其余均为0 )
|: 按位或 ---- 将数据变为二进制后每一位数字进行 “或” 的操作, 按位对比, 0,0 -> 0, 其余均为1
例: console.log(1 | 3) // 3
分别转换为2进制 1 ---> 00000001
3 ---> 00000011
按照或的操作 结果 00000011 -> 对应10进制的 3
(0,0 -> 0, 其余均为1)
^: 按位异或 ---- 将数据变为二进制后每一位数字进行 “异或” 的操作, 按位对比,相同为0, 不同为1
例: console.log(1 ^ 3) // 2
分别转换为2进制 1 ---> 00000001
3 ---> 00000011
按照或的操作 结果 00000010 -> 对应10进制的 2
(相同为0, 不同为1)
~: 按位非 ---- 变二进制后取非得到补码,看补码首位,为0则先+1后取反, 为1则先取反后+1
例: 正数取非 console.log(~1) // 2 负数取非 console.log(~-1) // 0
分别转换为2进制 1 ---> 00000001 10000001
取反 -> 得到补码 11111110 01111110
第一位为符号位, 0为+, 1为- - +
取下补码1 剩余数据 1111110 1111110
取反 0000001 1111111 -- 先+1
+1 0000010 0000000 -- 后取反
转10进制,加上符号 ---> -2 0
<<: 左移运算符 ---- 符号位不变, 按位左移, 右边补0
例: 正数取非 console.log(1 << 2) // 4
解析: 1 --- > 00000001
左移两位,右边补0 0000000100
结果(转10进制) 4
>>: 右移运算符 ---- 符号位不变, 按位右移, 左边补0(正数)
例1: 正数取非 console.log(3 >> 1) // 1
解析: 3 --- > 00000011
右移一位,左边补0 00000001 1 ---> 左边补了个0, 最后一位的1被挤掉
结果(转10进制) 1
例2: 正数取非 console.log(-18 >> 1) // -9
解析: -18 --- > 10010010
右移四位,左边补0 11001001 0 ---> 左边补了个1, 最后一位的0被挤掉
结果(转10进制) -