目录

Go语言中位清除运算符的应用场景

Go语言中位清除运算符的应用场景

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,即关闭状态)