首页 > 其他分享 >Go语言中的位运算符

Go语言中的位运算符

时间:2024-06-20 16:59:27浏览次数:13  
标签:运算 示例 Color uint8 运算符 按位 Go uint32 语言

位运算(bitwise operations)是计算机科学中非常基础且重要的运算类型,它直接操作二进制位。Go语言中提供了一组位运算符,用于执行位级别的操作。

Go语言中的位运算符

  1. 按位与(&)

    • 作用:对两个操作数的每个位进行与运算,只有对应位都为1时,结果位才为1。
    • 示例:5 & 3 (0101 & 0011 = 0001),结果为1。
  2. 按位或(|)

    • 作用:对两个操作数的每个位进行或运算,只有对应位有一个为1时,结果位才为1。
    • 示例:5 | 3 (0101 | 0011 = 0111),结果为7。
  3. 按位异或(^)

    • 作用:对两个操作数的每个位进行异或运算,当对应位不同时,结果位为1。
    • 示例:5 ^ 3 (0101 ^ 0011 = 0110),结果为6。
  4. 按位取反(^)

    • 作用:对操作数的每个位取反,0变1,1变0。
    • 示例:^5 (取反0101 = 1010),结果为-6(在Go语言中,按位取反运算符作用于有符号整数时,结果为该数的补码减一)。
  5. 左移(<<)

    • 作用:将操作数的二进制位左移指定的位数,右侧用0填充。
    • 示例:5 << 1 (0101 << 1 = 1010),结果为10。
  6. 右移(>>)

    • 作用:将操作数的二进制位右移指定的位数,左侧用0填充(对于无符号数),或用符号位填充(对于有符号数)。
    • 示例:5 >> 1 (0101 >> 1 = 0010),结果为2。

位运算在真实业务中的使用场景

  1. 权限管理

    • 位运算在权限管理系统中非常有用。权限可以用二进制位表示,每个位表示一种权限。通过按位与操作,可以快速检查用户是否拥有某种权限。
    • 示例:
      const (
          ReadPermission  = 1 << iota // 0001
          WritePermission             // 0010
          ExecutePermission           // 0100
      )
      
      func hasPermission(permissions, perm int) bool {
          return permissions&perm != 0
      }
      
      func main() {
          userPermissions := ReadPermission | WritePermission // 0011
          fmt.Println(hasPermission(userPermissions, ReadPermission))  // true
          fmt.Println(hasPermission(userPermissions, ExecutePermission)) // false
      }
      
  2. 状态标志

    • 在处理多种状态标志时,可以使用位运算来表示和操作状态。每个位代表一种状态,通过按位或操作可以设置状态,通过按位与和取反操作可以清除状态。
    • 示例:
      const (
          FlagUp       = 1 << iota // 0001
          FlagBroadcast            // 0010
          FlagLoopback             // 0100
          FlagPointToPoint         // 1000
      )
      
      func setFlag(flags, flag int) int {
          return flags | flag
      }
      
      func clearFlag(flags, flag int) int {
          return flags &^ flag
      }
      
      func hasFlag(flags, flag int) bool {
          return flags&flag != 0
      }
      
      func main() {
          var flags int
          flags = setFlag(flags, FlagUp) | setFlag(flags, FlagBroadcast)
          fmt.Println(hasFlag(flags, FlagUp))        // true
          fmt.Println(hasFlag(flags, FlagLoopback))  // false
          flags = clearFlag(flags, FlagBroadcast)
          fmt.Println(hasFlag(flags, FlagBroadcast)) // false
      }
      
  3. 数据压缩和解压

    • 位运算可以用于数据的压缩和解压,通过位移和掩码操作,可以将多个小的数据段打包成一个大数据段,或者从一个大数据段中提取出多个小的数据段。
    • 示例:
      func pack(r, g, b, a uint8) uint32 {
          return uint32(r)<<24 | uint32(g)<<16 | uint32(b)<<8 | uint32(a)
      }
      
      func unpack(packed uint32) (r, g, b, a uint8) {
          r = uint8(packed >> 24)
          g = uint8(packed >> 16)
          b = uint8(packed >> 8)
          a = uint8(packed)
          return
      }
      
      func main() {
          packed := pack(255, 128, 64, 32)
          fmt.Printf("Packed: %032b\n", packed) // Packed: 11111111010000000100000000100000
          r, g, b, a := unpack(packed)
          fmt.Printf("Unpacked: r=%d, g=%d, b=%d, a=%d\n", r, g, b, a) // Unpacked: r=255, g=128, b=64, a=32
      }
      
  4. 网络编程

    • 位运算在网络编程中也很常见,例如,IP地址和端口的打包和解包、协议标志位的操作等。
    • 示例:
      func ipToUint32(ip string) uint32 {
          var result uint32
          parts := strings.Split(ip, ".")
          for i, part := range parts {
              num, _ := strconv.Atoi(part)
              result |= uint32(num) << (24 - 8*i)
          }
          return result
      }
      
      func uint32ToIP(n uint32) string {
          return fmt.Sprintf("%d.%d.%d.%d", byte(n>>24), byte(n>>16), byte(n>>8), byte(n))
      }
      
      func main() {
          ip := "192.168.1.1"
          packedIP := ipToUint32(ip)
          fmt.Printf("Packed IP: %032b\n", packedIP) // Packed IP: 11000000101010000000000100000001
          unpackedIP := uint32ToIP(packedIP)
          fmt.Println("Unpacked IP:", unpackedIP)   // Unpacked IP: 192.168.1.1
      }
      
  5. 图形编程

    • 位运算在图形编程中广泛使用,例如颜色的表示和操作、位图的处理等。
    • 示例:
      type Color struct {
          R, G, B, A uint8
      }
      
      func (c Color) ToUint32() uint32 {
          return uint32(c.R)<<24 | uint32(c.G)<<16 | uint32(c.B)<<8 | uint32(c.A)
      }
      
      func Uint32ToColor(n uint32) Color {
          return Color{
              R: uint8(n >> 24),
              G: uint8(n >> 16),
              B: uint8(n >> 8),
              A: uint8(n),
          }
      }
      
      func main() {
          color := Color{R: 255, G: 128, B: 64, A: 32}
          packedColor := color.ToUint32()
          fmt.Printf("Packed Color: %032b\n", packedColor) // Packed Color: 11111111010000000100000000100000
          unpackedColor := Uint32ToColor(packedColor)
          fmt.Printf("Unpacked Color: R=%d, G=%d, B=%d, A=%d\n", unpackedColor.R, unpackedColor.G, unpackedColor.B, unpackedColor.A) // Unpacked Color: R=255, G=128, B=64, A=32
      }
      

通过这些示例,可以看到位运算在实际应用中的广泛使用。它们可以极大地提高代码的性能和效率,特别是在需要高效处理大量数据的场景中。

标签:运算,示例,Color,uint8,运算符,按位,Go,uint32,语言
From: https://www.cnblogs.com/crazytata/p/18259008

相关文章

  • C语言基础入门 -1
    一.计算机中单位bit -比特位(最小单位);byte-字节kb-千字节mb-兆字节gb-千兆字节tb-太字节1字节=8比特位;其他单位之间换算为1024;二.数据类型与所占字节char//字符型   1字节short//短整型   2字节int  //整型   4字节long//长整型  ......
  • gocv安装教程(简单版)
    环境:Windowsopencv:未安装官网教程介绍:参考gocv官网教程进行安装即可,用gocv官网给的一键脚本进行安装安装MinGW-W64和cmakeMingw版本在8.1以上,手动安装需要添加环境变量cmake官网scoop用户可以直接运行以下指令安装scoopinstallmingwscoopinstallcmake一键安装open......
  • 记录pyinstaller打包django项目遇到的坑
    由于工作需要,需要在内网部署一个Django项目生成exe,打包过程遇到了不少坑,在此记录一下。一、安装pyinstaller略。二、打包exe第一个问题:用pyinstaller-F-w生成的exe报错一开始用的是以下命令生成exe:pyinstaller-F-wxx.py导出完毕后,在dist/manage/目录下输入manage.......
  • PS去除logo背景
    一、打开图片二、点击通道选择色差最明显的通道三、复制通道四、点击载入 五、反选ctrl+shift+i(鼠标右键亦可,然后调整下范围) 六、点击图层,复制图层(ctrl+J) (先确保图层是解锁的,右边有个小锁)七、把有背景的图层可视取消即可......
  • 华为OD机试真题-跳格子三-2024年OD统一考试(D卷新题多语言解法)
    介绍博主介绍:CSDN领军人物top1的作者,文章累计被阅读3800w+,帮助800+同学进入OD,之前是知识星球最热华为OD专栏,现在转移到CSDN方便大家订阅。在线练习机试是在牛客考试,练习的时候也可以在牛客网练习,提前熟悉操作https://ac.nowcoder.com/acm/contest/5652/K点击上方链接......
  • pymongo pymongo.errors.ServerSelectionTimeoutError: Could not reach any servers
    代码myclient=pymongo.MongoClient("mongodb://root:[email protected]:27017/xxx?authSource=admin")mydb=myclient["xxx"]mycol=mydb["xxx"]报错全文pymongo.errors.ServerSelectionTimeoutError:Couldnotreachanyserversin......
  • 5.23实验二 SQL 语言的使用
    一、实验目的:掌握使用SQL语言进行各种查询的操作和视图的操纵方法。二、实验要求:在现有的数据库上进行各种查询操作,对视图的创建、使用等操作。三、实验步骤:1、开始→程序→MicrosoftSQLServer→SQLServerManagementStudio。2、在“连接到服务器”对话框中,选择......
  • Python Django 实现教师、学生双端登录管理系统
    文章目录PythonDjango实现教师、学生双端登录管理系统引言Django框架简介环境准备模型设计用户认证视图和模板URL路由前端设计测试和部署获取开源项目参考PythonDjango实现教师、学生双端登录管理系统引言在当今的教育环境中,数字化管理系统已成为必不可少的工......
  • Dragon Boat Festival Revised
    DragonBoatFestivalWiththeapproachingoftheDragonBoatFestival,thedesireofgoingbackhomebecamestrongerandstronger.AssoonasIarrivedhome,Ifeltrelaxedbecausethesmellofstickyriceandreedleavesfilledwiththeair.Itisfantast......
  • shell运算符
    熟练掌握以上运算符能够自如的应对linux日常shell脚本需求。数值运算符只能用在数字上,不能用在其它数据类型上算数运算符基本就是常见的数学用到的计算:+、-、*、/、%需要注意的是默认情况下,shell不会直接进行算术运算,而是把"算术符号"当做"字符串"与两个变量的值连接在......