package main
import "fmt"
func main() {
a := 5 //101
b := 1 //001
//100 -> 4
fmt.Println(a, b)
//位清除 当b为0的时候取a的值,当b为1的时候取0
fmt.Println(a &^ b)
}
《Go语言圣经》里面有对此的描述,x = a &^ b,当b为0的时候取a的值,当b为1的时候取0
但作为初学者不太明白什么场景可以用到这个运算符?
Gpt是这么说的:
位清空运算符(&^)在 Go 语言中非常有用,它的主要作用是将操作数中对应于另一个操作数中 1 的位“清零”。下面介绍几个常见的应用场景:
清除标志位
在很多场景下,我们会使用一个整数来存储多个状态或标志位。使用 &^ 运算符可以方便地清除特定的标志位。
例如,如果某个变量的某些位代表不同的状态,当需要取消某个状态时,可以用 &^ 运算符将相应的位清零。
const flagA = 1 << 0 // 0001
const flagB = 1 << 1 // 0010
flags := flagA | flagB // 同时设置 flagA 和 flagB,结果为 0011
// 清除 flagA 对应的位
flags = flags &^ flagA // 结果变成 0010,即只保留 flagB
//也就是说,在实际应用中,当某个状态的开关状态是A和B的交集flags
//我如果想取消A的状态,则可以用位清除,&^A则可以把A的状态关闭,只保留B的状态(如果A的位置为0则仍然是关闭状态,如果为1,则结果转换成0,即关闭状态)