名词介绍
有符号: 无符号表示全部的整数,包含负数和正数
无符号: 有符号代表全部是正整数,不包含负数的整数
源码: 计算机存储数字都是以二进制进行存储,并且第一位 数字为 0
表示正数, 1
表示负数,所以二进制称为源码, 比如 2
的二进制 0000 0010
反码: 对所有二进制进行取反操作, 1
变成 0
, 0
变成 1
, 当前数字为负数时,第一位数字不变(代表正负数), 比如 2
的反码 0111 1101
, -2
的反码 1111 1101
补码: 所有负数都是以补码进行存储,补码表现形式为 先求出反码, 接着+ 1
,比如 -2
的源码为 1000 0010, 反码为 1111 1101, 补码为 1111 1110
符号介绍
1.按位与(&)
参数1 | 参数2 | 结果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
参数1 | 参数2 | 结果 |
---|---|---|
0001 | 0001 | 0001 |
1100 | 1101 | 1100 |
使用场景 (平时在判断奇偶数的情况下使用):
(4 & 1) === 0 // true 偶数
(5 & 1) === 0 // false 奇数
(15 & 1) === 0 // false 奇数
2.按位或(|)
参数1 | 参数2 | 结果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
参数1 | 参数2 | 结果 |
---|---|---|
0001 | 0001 | 0001 |
1100 | 1101 | 1101 |
使用场景 (向下取整, 相当于Math.floor):
1.4 | 0 = 1
1.8 | 0 = 1
4.2 | 0 = 4
3.按位异或 (^)
参数1 | 参数2 | 结果 |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
参数1 | 参数2 | 结果 |
---|---|---|
0001 | 0001 | 0000 |
1100 | 1101 | 0001 |
使用场景 (交换两个数):
// 原始解法,使用额外空间
let a = 2;
let b = 3;
let temp = a;
a = b;
b = temp;
// 使用按位异或 (^) 解决
let a = 2;
let b = 3;
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 是不是有点懵了,原理如下,需要细品
// 如果
a ^ b = c
// 那么
c ^ b = a
c ^ a = b
注意:异或运算支持运算的交换律和结合律
4.左移(<<)
2 << 2 = 6;
图解:
0000 0000 0000 0010
--------------------
0000 0000 0000 1000
5.有符号右移(>>)
-4 >> 1 = -2;
图解:
1000 0000 0000 0100
--------------------
1000 0000 0000 0010
6.无符号右移 (>>>)
2 >>> 1 = 1;
图解:
0000 0000 0000 0010
--------------------
0000 0000 0000 0001