位运算(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
      }

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

Go语言中的位运算符的更多相关文章

  1. 关于C语言中的位运算符的学习即应用

    一.运算符的种类和运算规则: &      与:全1则1,有0则0   |       或:有1则1,全0则0   ^   异或:相同为0,不同为1   ~   取反:~是一元运算符,用来对一 ...

  2. C语言中两位ASCII码可以表示汉字

    最近偶然有人问到这个相关字符编码的问题,所以百度了下参考了这两个资料,进行了简单分析. ******************************************************** ...

  3. PHP中为位运算符(几乎很少用)

    PHP语言里的位运算符&.|.^ .~.〈〈 .〉〉 "&" 按位与运算 按位与运算符"&"是双目运算符.其功能是参与运算的两数各对应的 ...

  4. C语言中的位运算和逻辑运算

    这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...

  5. C语言提供的位运算符

      运算符 含义 描述 & 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 | 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1 ^ 按位异或 若参加运算的两个 ...

  6. C语言中关于逗号运算符的理解

    在C语言中运算符有很多,包括算数运算符.关系运算符.赋值运算符.位运算符.逻辑运算符.三目运算符.sizeof运算符.逗号运算符等等,那今天我们就重点来给大家讨论一下关于逗号运算符的一些运算规则. 首 ...

  7. C/C++语言中的位运算

    在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作. 一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率.C语 ...

  8. Javascript中的位运算符和技巧

    ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢? 有符号整数使用 3 ...

  9. Java中的位运算符、移位运算

    一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&)  :两位全为1,结果为1,否则为0: (2)按位或  (|)   :两位有一个为1,结果为1,否则为0: (3) ...

  10. 分享:Python中的位运算符

    按位运算符是把数字看作二进制来进行计算的.用的不太多,简单了解. 下表中变量 a 为 60,b 为 13二进制格式如下: a = 0011 1100 b = 0000 1101 a&b = 0 ...

随机推荐

  1. python+selenium基础之XPATH定位(第一篇)

    世界上最远的距离大概就是明明看到一个页面元素站在那里,但是我却定位不到!! selenium定位元素的方法有很多种,像是通过id.name.class_name.tag_name.link_text等 ...

  2. 【教程】解决npm 报错 npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.

    问题描述 只要在控制台执行npm,不论有没有参数,都会有此警告: npm WARN config global `--global`, `--local` are deprecated. Use `- ...

  3. Python和RPA网页自动化-让select标签下拉框选择指定文本的方法

    以影刀商城(https://shop.yingdao.com/webOperations/index)为例: 该下拉框有<select>标签.分别使用Python和RPA网页自动化让下拉框 ...

  4. P6764 [APIO2020] 粉刷墙壁

    思路: 本质上能进行的操作就是我们算出从第 \(i\) 块砖开始,连续刷 \(M\) 块砖,是否有承包商可以刷出期望颜色. 那么设 \(f_i\) 表示 \([i,i+m-1]\) 是否合法,那么就变 ...

  5. python性能分析器:cProfile

    代码: (1) import cProfile import re cProfile.run('re.compile("foo|bar")') 运行结果: (2) import c ...

  6. 为baselines算法库安装mujoco环境支持——ubuntu 20.04安装MuJoCo2.1.1

    下载开源版本的mujoco二进制文件: wget https://github.com/deepmind/mujoco/releases/download/2.1.1/mujoco-2.1.1-lin ...

  7. 这应该是全网最全的CSP-S初赛复习吧

    点我到洛谷看 \(Update\ 2024/8/2:\) 加入了在数据结构中增加了"树",做出部分更改. linux基础命令 cd 切换目录 ls 列出目前工作目录所含的文件及子目 ...

  8. Wetab新标签页:内置实用小组件的浏览器扩展,重新定义浏览器主页

    除了社交媒体,浏览器可能是我们日常工作.学习和生活中最常用的平台之一.然而,在使用浏览器的过程中,我们经常被书签管理.标签管理等问题所困扰.例如,书签栏混乱不堪,无法快速查找到所需书签. 为了和浏览器 ...

  9. Deformable DETR:商汤提出可变型 DETR,提点又加速 | ICLR 2021 Oral

    DETR能够消除物体检测中许多手工设计组件的需求,同时展示良好的性能.但由于注意力模块在处理图像特征图方面的限制,DETR存在收敛速度慢和特征分辨率有限的问题.为了缓解这些问题,论文提出了Deform ...

  10. mysql数据库中decimal数据类型比较大小

    在MySQL中,DECIMAL数据类型用于存储精确的数值,它非常适合用于需要高精度计算的场景,如金融应用.当我们需要在MySQL数据库中比较DECIMAL类型数据的大小时,可以使用标准的比较运算符,如 ...