之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先回顾一下位操作符的基础

位操作符

与操作:&
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

或操作:!
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 & 0 = 0

异或:^
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

左移:<<
1 << 10 = 1024
1 << 20 = 1M
1 << 30 = 1G

右移:>>
1024 >> 10 = 1
1024 >>1 = 512
1024 >>2 = 256

关于上述知识的一个应用实例

可能这个例子在实际中用并不是特别严谨,但是也提供了我们写代码的一种思路

这里拿微博或者qq用户的特权为例子:
一个qq号可以用VIP会员,SVIP超级会员,蓝钻用户,黄钻用户,红钻用户....
我们通常的想法可能是如果数据库中存储自己会给用户存这个字段表示这个用户开通了哪些特权
我们在代码中的写法可能也是如下所示:

 package main

 import (
"fmt"
) type users struct {
name string
flag uint8
vip bool
svip bool
blue bool
red bool
yellow bool
} func setVip(user users) users {
user.vip = true
return user
} func isVip(user users) {
if user.vip {
fmt.Println("user is vip")
} else {
fmt.Println("user is not vip")
}
} func binaryTest() {
var user users
user.name = "test01"
user.vip = true
isVip(user)
user.vip = false
isVip(user)
} func main() {
binaryTest() }

这种实现方式也可以,但是明显我们需要为每个类型都做操作,并且如果以后又有更多的各种各样的会员和钻有需要添加新的,所以并不是最佳方法,下面我们通过位操作来实现上述的功能,代码如下:

 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()
}

上面代码就是一种位运算一种非常巧妙的用法,当新添加各种特权的时候只需要在最开始定义的常亮那里添加一行代码即可,就可以直接实现对这种特权的设置和取消,以及查看是否开通。

最新文章

  1. maven package 知识(转载)
  2. u3d_Shader_effects笔记6 第二章 animating sprite
  3. HttpWebRequest请求时无法发送具有此谓词类型的内容正文。
  4. BLE Hacking:使用Ubertooth one扫描嗅探低功耗蓝牙
  5. jwplayer直播
  6. Android压力测试快速入门教程(图解)——Monkey工具
  7. sql 与linq的转换
  8. [UWP]不怎么实用的Shape指南:自定义Shape
  9. MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具
  10. 滤波器——BoxBlur均值滤波及其快速实现
  11. 2019浙江省赛B zoj4101 Element Swapping(推公式)
  12. Mysql 用户和权限
  13. 【转】用ffmpeg转多音轨的mkv文件
  14. A1105. Spiral Matrix
  15. ActiveMQ常见消息类型
  16. springboot+mockito 异常解决方案
  17. MVC开发中的常见错误-07-“System.IO.DirectoryNotFoundException”类型的未经处理的异常在 mscorlib.dll 中发生
  18. PHP 快速实现大文件上传
  19. javascript开发HTML5游戏--斗地主(单机模式part2)
  20. Accounting_会计电算化工作指南

热门文章

  1. dubbo 笔记-XML配置文件简介
  2. PHP设计模式四:适配器模式
  3. 理解vue中的scope的使用
  4. js实现一个简单钟表动画(javascript+html5 canvas)
  5. 我的第一个python web开发框架(14)——后台管理系统登录功能
  6. switchhost -- 切换host的工具
  7. 基于HTML5及WebGL的工控SCADA模拟飞机飞行
  8. Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现(不定期更新中~~~)
  9. 使用element ui 日期选择器获取值后的格式问题
  10. 基于netfilter和LVM的密码窃取