位运算及典型应用(Golang)
与操作(AND, 全部为1):&
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
0110 & 1011 = 0010
或操作(OR, 至少一个为1):|
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
0110 | 1011 = 1111
异或(XOR, 只能一个为1):^
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
0110 ^ 1011 = 1101
左移:<<
1 << 3 = 1000
1 << 10 = 1024
1 << 20 = 1M
1 << 30 = 1G
右移:>>
255 >> 3 = 11111
1024 >> 10 = 1
1024 >> 1 = 512
1024 >> 2 = 256
package main
import (
"fmt"
)
type users struct {
name string
flag uint8
}
// 这里通过位移的方式默认00000 从左边一次为vip,svip,blue,red,yellow
const (
vip = 1
svip = (1 << 1)
blue = (1 << 2)
red = (1 << 3)
yello = (1 << 4)
)
// setFlag 用于设置用户开通了哪些特权
func setFlag(user users, isSet bool, typeFlag uint8) users {
if isSet == true {
user.flag = user.flag | typeFlag
} else {
user.flag = user.flag ^ typeFlag
}
return user
}
//isFlag 用于判断用户是否开通某项特权
func isFlag(user users, typeFlag uint8) bool {
result := user.flag & typeFlag
return result == typeFlag
}
func binaryTest() {
var user users
user.name = "coder"
user.flag = 0
//判断用户是否是vip
result := isFlag(user, vip)
fmt.Printf("user is Vip:%t\n", result)
//给用户开通vip,并看用户是否开通vip
user = setFlag(user, true, vip)
result = isFlag(user, vip)
fmt.Printf("user is Vip:%t\n", result)
//取消用户的vip,并查看用户是否还是vip
user = setFlag(user, false, vip)
result = isFlag(user, vip)
fmt.Printf("user is Vip:%t\n", result)
}
func main() {
binaryTest()
}
发布:2021-01-04 21:52:05