最近一直在撸vue3源码,在runtime-core中,碰到位运算的代码,这个东西平时实在是没有用过,所以认真查阅了资料,总结一下!
简介
简单来说位运算就是计算机在二进制位置上的计算。
为什么使用
使用位运算来写业务代码是并不提倡,因为会使代码维护起来困难,但在vue源码库中会被使用,是因为它不但可以提升性能而且非常巧妙,因为计算机的计算时使用的二进制,位运算就是建立在二进制上的运算方式,所以效率会更高,
开始学习
学前小知识补充
- 如何计算二进制
- 二进制中的符号位
js中的内存存贮描述,这篇文章很长,我们只要先知道二进制的第一位(符号位)代表正负就行了,一会右位移的的时候要用到这个知识。
进入正文
先列下常用的位运算符:
AND OR XOR
- 先说AND(和):如果两位都是 1 则设置每位为 1
- 然后是OR(或):如果两位之一为 1 则设置每位为 1
- 然后是XOR(异或),如果两位只有一位为 1 则设置每位为 1。
看完这些描述,我是觉得不太好记,去找了一下其他博客,一些博主这么描述:
- & 是按位与,全1则1,否则是0
- | 是按位或,全0则0,否则是1
- ^ 是判断是否相等,相同为0,不同为1
我也认为全1则1,全0则0的说法更好记一些,然后我们来举个例子对比一下,拿5和1来做运算,5的二进制为0101,1的二进制为0001,那么:
| 操作 | 等同于 | 结果 |
|---|---|---|
| 5 & 1 | 0101 & 0001 | 0001 |
| 5 | 1 | 0101 | 0001 | 0101 |
| 5 ^ 1 | 0101 ^ 0001 | 0100 |
是不是很简单,逐位对比,然后逐位赋值就可以了。
XOR
- ~ 反转所有位,这个也好记
| 操作 | 等同于 | 结果 |
|---|---|---|
| ~5 | ~0101 | 1010 |
左位移 右位移
左位移符号<<,又叫零填充左位移,丢弃高位,低位补0即按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
| 操作 | 等同于 | 结果 |
|---|---|---|
| 5 << 1 | 0101 << 1 | 1010 |
右位移分为有符号右位移和零填充右位移,做法就是丢弃低位,高位补0或符号位,两个箭头的是有符号右位移,拷贝最左侧的符号位以填充左侧,三个箭头的零填充右位移,直接补零。
| 操作 | 等同于 | 结果 |
|---|---|---|
| 5 >> 1 | 0101 >> 1 | 0010 |
| 5 >>> 1 | 0101 >>> 1 | 0010 |
位运算和权限方案
定义
首先我们先来定义权限,简单来设计四种权限,用二进制的方式把所有的权限表示出来:
- 权限1 --> 0001
- 权限2 --> 0010
- 权限3 --> 0100
- 权限4 --> 1000
在这里权限码都是唯一,而且在这个二进制表示的权限码中只有一位是1,其余都是0
我们可以发现,第二个权限就是把上一个的权限中的1向左移动了一位,这不就是上面刚学到的左位移么,我们用代码来表示一下
const power1 = 1;
const power2 = 1 << 1;
const power3 = 1 << 2;
const power4 = 1 << 3;
添加权限( | )
let user1 = power1 | power2; --> 0011
let user2 = power2 | power3 ; --> 0110
校验权限( & )
!!(user1 & power1) --> true
!!(user2 & power1) --> false
删除权限( ^ )
user1 = user1^power1 --> 2(0010)
!!(user1 & power1) --> false
更新不易,有学到的小伙伴点个赞吧