小白如何搞懂js中的位运算

191 阅读3分钟

最近一直在撸vue3源码,在runtime-core中,碰到位运算的代码,这个东西平时实在是没有用过,所以认真查阅了资料,总结一下!

简介

简单来说位运算就是计算机在二进制位置上的计算。

为什么使用

使用位运算来写业务代码是并不提倡,因为会使代码维护起来困难,但在vue源码库中会被使用,是因为它不但可以提升性能而且非常巧妙,因为计算机的计算时使用的二进制,位运算就是建立在二进制上的运算方式,所以效率会更高,

开始学习

学前小知识补充

  1. 如何计算二进制 image.png
  2. 二进制中的符号位

js中的内存存贮描述,这篇文章很长,我们只要先知道二进制的第一位(符号位)代表正负就行了,一会右位移的的时候要用到这个知识。

进入正文

先列下常用的位运算符: image.png

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 & 10101 & 00010001
5 | 10101 | 00010101
5 ^ 10101 ^ 00010100

是不是很简单,逐位对比,然后逐位赋值就可以了。

XOR

  • ~ 反转所有位,这个也好记
操作等同于结果
~5~01011010

左位移 右位移

左位移符号<<,又叫零填充左位移丢弃高位,低位补0即按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

操作等同于结果
5 << 10101 << 11010

右位移分为有符号右位移零填充右位移,做法就是丢弃低位,高位补0或符号位,两个箭头的是有符号右位移,拷贝最左侧的符号位以填充左侧,三个箭头的零填充右位移,直接补零。

操作等同于结果
5 >> 10101 >> 10010
5 >>> 10101 >>> 10010

位运算和权限方案

定义

首先我们先来定义权限,简单来设计四种权限,用二进制的方式把所有的权限表示出来:

  • 权限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

更新不易,有学到的小伙伴点个赞吧