Go语言中你所不知道的位操作用法
前言
因为之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先回顾一下位操作符的基础
位操作符
与操作:&
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超级会员,蓝钻用户,黄钻用户,红钻用户....
我们通常的想法可能是如果数据库中存储自己会给用户存这个字段表示这个用户开通了哪些特权
我们在代码中的写法可能也是如下所示:
packagemain import( "fmt" ) typeusersstruct{ namestring flaguint8 vipbool svipbool bluebool redbool yellowbool } funcsetVip(userusers)users{ user.vip=true returnuser } funcisVip(userusers){ ifuser.vip{ fmt.Println("userisvip") }else{ fmt.Println("userisnotvip") } } funcbinaryTest(){ varuserusers user.name="test01" user.vip=true isVip(user) user.vip=false isVip(user) } funcmain(){ binaryTest() }
这种实现方式也可以,但是明显我们需要为每个类型都做操作,并且如果以后又有更多的各种各样的会员和钻有需要添加新的,所以并不是最佳方法,下面我们通过位操作来实现上述的功能,代码如下:
packagemain import( "fmt" ) typeusersstruct{ namestring flaguint8 } //这里通过位移的方式默认00000从左边一次为vip,svip,blue,red,yellow const( vip=1 svip=(1<<1) blue=(1<<2) red=(1<<3) yello=(1<<4) ) //setFlag用于设置用户开通了哪些特权 funcsetFlag(userusers,isSetbool,typeFlaguint8)users{ ifisSet==true{ user.flag=user.flag|typeFlag }else{ user.flag=user.flag^typeFlag } returnuser } //isFlag用于判断用户是否开通某项特权 funcisFlag(userusers,typeFlaguint8)bool{ result:=user.flag&typeFlag returnresult==typeFlag } funcbinaryTest(){ varuserusers user.name="coder" user.flag=0 //判断用户是否是vip result:=isFlag(user,vip) fmt.Printf("userisVip:%t\n",result) //给用户开通vip,并看用户是否开通vip user=setFlag(user,true,vip) result=isFlag(user,vip) fmt.Printf("userisVip:%t\n",result) //取消用户的vip,并查看用户是否还是vip user=setFlag(user,false,vip) result=isFlag(user,vip) fmt.Printf("userisVip:%t\n",result) } funcmain(){ binaryTest() }
上面代码就是一种位运算一种非常巧妙的用法,当新添加各种特权的时候只需要在最开始定义的常亮那里添加一行代码即可,就可以直接实现对这种特权的设置和取消,以及查看是否开通。
附常见的>>右移<<左移感觉右移左移应该也是非常常见的使用了
继续看例子:
packagemain import"fmt" funcmain(){ x:=2 y:=4 fmt.Println(x<<1) fmt.Println(y>>1) }output:42
进行转化为二进制然后向左或者向右移动。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。