Golang中&^运算符的含义是什么?附math包Abs函数实现示例
Go 位运算符
&^ 作用解析 &^ 是Go语言内置的*按位清除(AND NOT)*运算符,作用是精准清除左操作数中指定的二进制位。
运算规则
对于两个操作数 a &^ b,逐位运算逻辑如下:
- 若右操作数
b的某一位为1,则结果的对应位强制置0,不管左操作数a该位原先是0还是1 - 若右操作数
b的某一位为0,则结果的对应位等于a的对应位原值
举个直观的二进制示例:
a = 0111,b = 0010
运算a &^ b时,b只有第2位(从0数最低位是第0位)为1,所以a的第2位会被清零,其余位保留,最终结果为0101
另外这个运算符也可以拆解为常规位运算的组合,a &^ b 和 a & (^b) 运算结果完全等价,&^ 属于Go提供的简化语法糖。
结合math.Abs实现的实际应用示例
你给出的Abs函数实现,正是利用了按位清除的特性:
func Abs(x float64) float64 { return Float64frombits(Float64bits(x) &^ (1 << 63)) }
首先我们知道IEEE 754标准的双精度浮点数(也就是Go里的float64),二进制结构的最高位(第63位,从0开始计数)是符号位:0代表正数,1代表负数。
代码里的1 << 63运算得到的二进制值,只有第63位为1,其余所有位都是0。当和Float64bits(x)(也就是把float64转成对应的无符号整数形式的二进制值)做&^运算时,只会把x的符号位强制清零,其余数值位完全保留,最终转换回float64之后,不管原数是正还是负,结果都是正数,也就是原数的绝对值。这种位运算实现比判断符号再取反的方式性能要高很多。
内容的提问来源于stack exchange,提问作者N. J
相关产品推荐
相关产品推荐

