使用二进制位标记状态

2021/09/23 posted in  Go 后端开发 comments

笔者实战过程中经常使用到一组二进制位来标记状态,因此也就涉及到对指定位进行修改操作,代码示例使用Go来实现

Go 位运算相关知识

&      位运算 AND
|      位运算 OR
^      位运算 XOR
&^     位清空 (AND NOT)
<<     左移
>>     右移

修改二进制数中指定位

示例代码

func ModifyStatus(status int, indexOf int, to bool) int{
	if to{
		return status | (1 << indexOf)
	}else{
		return status &^ (1 << indexOf)
	}
}

代码中indexOf为从右往左数第几位

测试样例

func main() {
	status := 0
	fmt.Printf("%08b\n", status) //00000000
	status = ModifyStatus(status, 0, true)
	fmt.Printf("%08b\n", status) //00000001
	status = ModifyStatus(status, 0, false)
	fmt.Printf("%08b\n", status) //00000000
	status = ModifyStatus(status, 3, true)
	fmt.Printf("%08b\n", status) //00001000
	status = ModifyStatus(status, 3, false)
	fmt.Printf("%08b\n", status) //00000000
}
00000000
00000001
00000000
00001000
00000000

判断某一位二进制位使用为1或0

func CheckStatus(status int, indexOf int, to bool) bool{
	if to{
		return status | (1 << indexOf) == status
	}else{
		return status &^ (1 << indexOf) == status
	}
}

测试样例

func main() {
	status := 119
	fmt.Printf("%08b\n", status) //01110111
	fmt.Println(CheckStatus(status, 3,false)) // true
	fmt.Println(CheckStatus(status, 1,true)) // true
	fmt.Println(CheckStatus(status, 1,false)) // false
}
01110111
true
true
false

使用二进制位优先级标记权限

假设使用8位二进制数表示状态,其中3位为权限标记位,使用最高3位来表示,优先级越高位越高。依次为账号是否可用,账号是否为标准用户态,账号是否为管理员

0xxxxxxx 账号被禁用
1xxxxxxx 账号为非标准用户
11xxxxxx 账号为标准用户
111xxxxx 账号为管理员

判断账号是否可用仅需判断status >= 128

判断账号是否为标准用户判断status >= 192

判断账号是否为管理员判断status >= 224

无需关心其他状态位

三个状态为将用户权限划分为4个区间
管理员 标准用户 非标准用户 禁用用户