You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:24:03