在 Go 语言中有个特殊的位运算符,使用 &^
符号表示,包含与操作和取反操作。
《Go语言圣经》里面有对此的描述,z = x &^ y
,如果 y 中比特位为 1 那么 z 对应比特位值就是 0,否则 z 就使用 x 对应位置的比特位值。
这种解释方法太绕了,实际执行方式是 x 和 y取反后的值进行与操作。实际应用中,如果我们需要一次清除多个比特位的,就可以使用这个运算符。
如下所示,我们定义了类似 unix 文件权限的枚举值,如果我们需要移除 Read 和 Write 权限,那么可以这样做
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package main
import "fmt"
func main() { const ( Read byte = 1 << iota Write Execute )
var f1 = Read | Write | Execute var f2 = Read | Write
var f = f1 &^ f2
fmt.Printf("%03b &^ %03b = %03b\n", f1, f2, f)
}
|