用位运算来将多个数据保存到一个数字里

3/4/2019 #bitwise #javascript

在一个应用/网站里,通常有很多个开关选项,需要在客户端和用户之间来回传送, 在query里大概会变成这样

https://xxxxx.com/?option1=on&option2=off&option3=on&option4=off&option5=on

想象一下上面的选项如果并列排起来,on变为1,off变为2,那么会得到一个二进制的数字10101,然后将这个二进制数字转为十进制parseInt('10101', 2)得到的结果是21,这样上面的query就可以写成

https://xxxxx.com/?options=21

而想要用js来实现把这一系列option来变成一个十进制的数字很简单,只需要用bitor操作符|

const options=[
  true,
  false,
  true,
  false,
  true
]
const number = options.reduce((p,c,i) => p | (c?Math.pow(2,i):0), 0)
//number = 21

传到服务器端以后还原也很简单

const options = Array(5).fill().map((d,i)=>!!(req.query.options & Math.pow(2,i))) 
// options = [true, false, true, false, true]