用于标记不同状态的数据结构

1.使用用途

例:业务开发中,经常会遇到一些用户状态标记问题,比如签到没,收藏没,领取奖励没等等,如果用多个字段表示,数据库就会特别繁杂。所以会有人用1000010010这样的数字表示,个十百千万分别代表不同的意思,但是还是比较浪费资源,下面用位运算实现了一个标记的数据结构。每一位都用0/1代表是否标记

2.数据结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function BitArray(inVal){
this.data = inVal || 0;
}

#设置总值
BitArray.prototype.setInner = function(inval){
this.data = inVal || 0;
}

#获取总值
BitArray.prototype.getInner = function(){
return this.data;
}

#根据位数来设置标记(限制32的标记)
BitArray.prototype.setBit = function(bitPos){
if(!Number.isInteger(bitPos) || bitPos >= 32 || bit < 0){
throw new Error('BitArray bitPos must be between 0 and 31')
}
this.data |= (0x00000001<<bitPos);
return true;
}

#根据位数清除标记(限制32的标记)
BitArray.prototype.clearBit = function(bitPos){
if(!Number.isInteger(bitPos) || bitPos >= 32 || bit < 0){
throw new Error('BitArray bitPos must be between 0 and 31')
}
this.data &= (~(0x00000001<<bitPos));
return true;
}

#获取某位是否处于标记状态(限制32的标记)
BitArray.prototype.isBitSet = function(bitPos){
if(!Number.isInteger(bitPos) || bitPos >= 32 || bit < 0){
throw new Error('BitArray bitPos must be between 0 and 31')
}
return !!((this.data & (0x00000001<<bitPos)) > 0);
}

3.使用方式

例:假如需要标记玩家的今日签到,今日是否充值,今日是否玩副本等等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#签到用第0位表示,充值用第1位表示,玩副本用第2位表示,以次类推

let dailyFlag = new BitArray(0); #初始值为0,代表什么都没有标记

#当玩家签到了,设置第0位标记
dailyFlag.setBit(0);

#查看是否签到
let isSigned = dailyFlag.isBitSit(0);

#假如需要清除某位的标记状态,则用 dailyFlag.clearSet(位数)

#次日首次登录,清除昨天的标记状态
dailyFlag = new BitArray(0); #直接重新初始化
-------------本文结束感谢您的阅读-------------
分享不易,请我喝杯咖啡吧~~~