Go语言中的位运算符
位运算(bitwise operations)是计算机科学中非常基础且重要的运算类型,它直接操作二进制位。Go语言中提供了一组位运算符,用于执行位级别的操作。
Go语言中的位运算符
按位与(&):
- 作用:对两个操作数的每个位进行与运算,只有对应位都为1时,结果位才为1。
- 示例:
5 & 3(0101 & 0011 = 0001),结果为1。
按位或(|):
- 作用:对两个操作数的每个位进行或运算,只有对应位有一个为1时,结果位才为1。
- 示例:
5 | 3(0101 | 0011 = 0111),结果为7。
按位异或(^):
- 作用:对两个操作数的每个位进行异或运算,当对应位不同时,结果位为1。
- 示例:
5 ^ 3(0101 ^ 0011 = 0110),结果为6。
按位取反(^):
- 作用:对操作数的每个位取反,0变1,1变0。
- 示例:
^5(取反0101 = 1010),结果为-6(在Go语言中,按位取反运算符作用于有符号整数时,结果为该数的补码减一)。
左移(<<):
- 作用:将操作数的二进制位左移指定的位数,右侧用0填充。
- 示例:
5 << 1(0101 << 1 = 1010),结果为10。
右移(>>):
- 作用:将操作数的二进制位右移指定的位数,左侧用0填充(对于无符号数),或用符号位填充(对于有符号数)。
- 示例:
5 >> 1(0101 >> 1 = 0010),结果为2。
位运算在真实业务中的使用场景
权限管理:
- 位运算在权限管理系统中非常有用。权限可以用二进制位表示,每个位表示一种权限。通过按位与操作,可以快速检查用户是否拥有某种权限。
- 示例:
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
}
状态标志:
- 在处理多种状态标志时,可以使用位运算来表示和操作状态。每个位代表一种状态,通过按位或操作可以设置状态,通过按位与和取反操作可以清除状态。
- 示例:
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
}
数据压缩和解压:
- 位运算可以用于数据的压缩和解压,通过位移和掩码操作,可以将多个小的数据段打包成一个大数据段,或者从一个大数据段中提取出多个小的数据段。
- 示例:
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
}
网络编程:
- 位运算在网络编程中也很常见,例如,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
}
图形编程:
- 位运算在图形编程中广泛使用,例如颜色的表示和操作、位图的处理等。
- 示例:
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语言中的位运算符的更多相关文章
- 关于C语言中的位运算符的学习即应用
一.运算符的种类和运算规则: & 与:全1则1,有0则0 | 或:有1则1,全0则0 ^ 异或:相同为0,不同为1 ~ 取反:~是一元运算符,用来对一 ...
- C语言中两位ASCII码可以表示汉字
最近偶然有人问到这个相关字符编码的问题,所以百度了下参考了这两个资料,进行了简单分析. ******************************************************** ...
- PHP中为位运算符(几乎很少用)
PHP语言里的位运算符&.|.^ .~.〈〈 .〉〉 "&" 按位与运算 按位与运算符"&"是双目运算符.其功能是参与运算的两数各对应的 ...
- C语言中的位运算和逻辑运算
这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...
- C语言提供的位运算符
运算符 含义 描述 & 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 | 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1 ^ 按位异或 若参加运算的两个 ...
- C语言中关于逗号运算符的理解
在C语言中运算符有很多,包括算数运算符.关系运算符.赋值运算符.位运算符.逻辑运算符.三目运算符.sizeof运算符.逗号运算符等等,那今天我们就重点来给大家讨论一下关于逗号运算符的一些运算规则. 首 ...
- C/C++语言中的位运算
在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作. 一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率.C语 ...
- Javascript中的位运算符和技巧
ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢? 有符号整数使用 3 ...
- Java中的位运算符、移位运算
一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&) :两位全为1,结果为1,否则为0: (2)按位或 (|) :两位有一个为1,结果为1,否则为0: (3) ...
- 分享:Python中的位运算符
按位运算符是把数字看作二进制来进行计算的.用的不太多,简单了解. 下表中变量 a 为 60,b 为 13二进制格式如下: a = 0011 1100 b = 0000 1101 a&b = 0 ...
随机推荐
- IDEA整合Spring+Struts+Hibernate项目
新手使用idea整合Spring+Struts+Hibernate项目 项目所需jar下载: https://download.csdn.net/download/weixin_44906002/12 ...
- c++ 快速复习第一部份
去年有事无事学过一c++ ,,由于工作用不上,学来没有用,所以学得乱七八的,最近需要复习一下,因为最近想学习一下硬 件相关 第一 引用头文件和自定义头 #include <iostream& ...
- springMvc使用自定义View生成Excel表格
1:通过自定义的View视图可以让请求直接到一个Excel表去. 2:自定义的视图必须继承 AbstractXlsView /AbstractXlsxView / AbstractXlsxStrea ...
- 【DingTalk】钉钉应用开发
前言部分 最近要开发一个企业内部应用系统 无纸化办公使用钉钉,领导想在钉钉的基础上加入我们自己的应用 引入Activiti工作流引擎开发审批立项等等业务活动,做一个大一统的系统 然后让我负责开发钉钉应 ...
- 【Java】SonarLint 疑难语法修正
规范驼峰命名使用: 提示信息 Local variable and method parameter names should comply with a naming convention 代码片段 ...
- 【Web】 抓包工具Charles
官方软件包下载 https://www.charlesproxy.com/download/ 在线生成激活码: https://www.zzzmode.com/mytools/charles/ 代理设 ...
- 读论文《Distilling the Knowledge in a Neural Network》——蒸馏网络 —— 蒸馏算法 —— 知识蒸馏 中的温度系数到底怎么用, temperature怎么用?
论文地址: https://arxiv.org/pdf/1503.02531.pdf 蒸馏网络的重要公式: 其中,\(p^g\)为Teacher网络,\(q\)为Student网络. 个体神经网络(C ...
- Jax报错:Windows系统环境下WSL中运行Jax会导致nvidia-smi报错退出,无法使用nvidia-smi和gpustat
环境: Window11下的WSL: 运行jax,导致nvidia-smi无法使用,不过经过测试发现虽然nvidia-smi报错无法使用,但是GPU已经可以正常使用,调用jax的GPU运行也保持正常, ...
- 是忧是喜?——微软撑腰,奥特曼重回OpenAI任CEO —— 争论点:AI发展规范化是否会损害美国在AI领域的领先地位 —— AI发展是否需要规范化
参考: https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_1027953478745543 ...
- Longley数据集——强共线性的宏观经济数据,包含GNP deflator(GNP平减指数)、GNP(国民生产总值)、Unemployed(失业率)、ArmedForces(武装力量)、Population(人口)、year(年份),Emlpoyed(就业率)。LongLey数据集因存在严重的多重共线性问题,在早期经常用来检验各种算法或计算机的计算精度
Longley数据集来自J.W.Longley(1967)发表在JASA上的一篇论文,是强共线性的宏观经济数据,包含GNP deflator(GNP平减指数).GNP(国民生产总值).Unemploy ...