Go语言中你所不知道的位操作用法

作者:python修行路 时间:2024-05-29 22:07:00 

前言

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

位操作符

与操作:&

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

进行转化为二进制 然后向左或者向右移动。

来源:http://www.cnblogs.com/zhaof/p/7979651.html

标签:go语言,位操作
0
投稿

猜你喜欢

  • Python如何匹配文本并在其上一行追加文本

    2022-10-19 13:16:43
  • 实用自动化运维Python脚本分享

    2022-05-23 20:26:57
  • 对python操作kafka写入json数据的简单demo分享

    2023-05-04 21:24:08
  • Python rstrip()方法实例详解

    2021-05-16 10:05:40
  • python中文分词教程之前向最大正向匹配算法详解

    2023-07-23 12:51:22
  • Vue之计算属性详解

    2024-04-27 15:57:27
  • uniapp小程序之配置首页搜索框功能的实现

    2024-04-22 13:03:28
  • Django-celery-beat动态添加周期性任务实现过程解析

    2021-07-29 13:09:49
  • 高考考python编程是真的吗

    2023-11-13 04:48:47
  • 浅谈go中cgo的几种使用方式

    2024-02-15 06:55:51
  • Python中使用PIPE操作Linux管道

    2022-02-10 18:25:25
  • SQL2008中通过DBCC OPENTRAN和会话查询事务

    2024-01-12 20:15:20
  • Python统计序列和文件中元素的频度

    2021-02-03 15:03:43
  • python orm 框架中sqlalchemy用法实例详解

    2021-04-22 18:03:28
  • Python判断以什么结尾以什么开头的实例

    2021-07-31 06:42:58
  • mysql简单实现查询结果添加序列号的方法

    2024-01-26 11:33:56
  • 简述:我为什么选择Python而不是Matlab和R语言

    2021-05-13 06:51:27
  • python环境路径配置以及命令行运行脚本

    2023-09-19 21:19:05
  • keras实现theano和tensorflow训练的模型相互转换

    2023-04-18 05:49:26
  • 使用Python将Mysql的查询数据导出到文件的方法

    2024-01-17 21:36:22
  • asp之家 网络编程 m.aspxhome.com