Skip to content

位运算符

<<

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 的同学没有任何能力

篮球足球爬山打乒乓球游泳
00000
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;

本质是一个二进制向量,具有更好的空间效率和查询时间