这篇文章主要介绍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超级会员,蓝钻用户,黄钻用户,红钻用户....
我们通常的想法可能是如果数据库中存储自己会给用户存这个字段表示这个用户开通了哪些特权
我们在代码中的写法可能也是如下所示:
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() }
上面代码就是一种位运算一种非常巧妙的用法,当新添加各种特权的时候只需要在最开始定义的常亮那里添加一行代码即可,就可以直接实现对这种特权的设置和取消,以及查看是否开通。
附常见的>>右移 <<左移 感觉右移左移应该也是非常常见的使用了
继续看例子:
package main import "fmt" func main() { x := 2 y := 4 fmt.Println(x<<1) fmt.Println(y>>1) }output:4 2
进行转化为二进制 然后向左或者向右移动。
以上是“Go语言中位操作有什么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联成都网站设计公司行业资讯频道!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。