Copyright © 2015 Powered by MWeb, Theme used GitHub CSS.
笔者实战过程中经常使用到一组二进制位来标记状态,因此也就涉及到对指定位进行修改操作,代码示例使用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
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个区间
管理员 标准用户 非标准用户 禁用用户
Copyright © 2015 Powered by MWeb, Theme used GitHub CSS.