CodeBlog

位运算及典型应用(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

鲁ICP备17013715号 min-Blog powered by ZPHP-MIN