位运算符
<<
js
// 将左边数转为2进制后,向左移动n位并在低位补0
// 3转为2进制为:11,向左移动2位为:1100,再转为10进制为:12
3 << 2;
>>
js
// 将右边数转为2进制后,向右移动n位并在高位补0,但是要保证原来位数不变
// 3转为2进制为:11,向右移动1位为:01,再转为10进制为:1
3 >> 1;
|
将两个数都转为 2 进制,相同位置有包含
1,则最终数的当前位置也是 1
js
/*
8: 1000
2: 0010
==>1010 转为10进制为10
*/
8 | 2;
&
将两个数都转为 2 进制,相同位置都是
1,则最终数的当前位置也是 1
js
/*
8: 1000
2: 0010
==>0000 转为10进制为0
*/
8 & 2;
可以提供哪些能力?
假设这样一堆能力,一个名为 A 的同学没有任何能力
篮球 | 足球 | 爬山 | 打乒乓球 | 游泳 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
js
let A = 0;
const Swimming = 1 << 1; // 0 0 0 0 1
const PingPang = 1 << 2; // 0 0 0 1 0
const Climbing = 1 << 3; // 0 0 1 0 0
const Football = 1 << 4; // 0 1 0 0 0
const Basketball = 1 << 5; // 1 0 0 0 0
// 让A具备游泳的能力
A |= Swimming;
// 让A具备打篮球的能力
A |= Basketball;
// 判断A是否具备游泳的能力
A & Swimming; // 如果值大于0则表示具备,反正则不具备
A & Football;
本质是一个二进制向量,具有更好的空间效率和查询时间