Go语言中&^和&^=运算符的用法和含义

4

我已经搜索了大约一周,但似乎找不到一个合适的解释来说明 Go 语言中这两个运算符 &^&^= 的含义和用法。请问有没有善心人能够为我解惑?

2个回答

11

当我们看所有的位运算符时,这就更容易理解了:

&    bitwise AND
|    bitwise OR
^    bitwise XOR
&^   bit clear (AND NOT)
  1. 按位与(&):当两个操作数的位都为1时,结果为1,否则结果为0。
  2. 按位或(|):当至少一个操作数的位为1时,结果为1;如果两个操作数的位都为0,则结果为0。
  3. 按位异或(^):当且仅当一个操作数的位为1时,结果为1,否则结果为0。这三个运算符(&, |, ^)无论操作数的顺序如何,都会产生相同的结果。
  4. 按位清零(&^):当第一个操作数的位为1且第二个操作数的位为0时,结果为1;否则结果为0。请注意,操作数的顺序会影响结果。要使结果为1,第一个操作数的位必须为1,而第二个操作数的位必须为0。

以下是演示按位运算符行为的代码,也可在Go Playground上查看

package main

import "fmt"

func main() {
    fmt.Println(`AND`)
    fmt.Printf("%b & %b results in %03b\n", 4, 5, 4&5)
    fmt.Printf("%b & %b results in %03b\n", 5, 4, 5&4)
    fmt.Println(`OR`)
    fmt.Printf("%b | %b results in %03b\n", 4, 5, 4|5)
    fmt.Printf("%b | %b results in %03b\n", 5, 4, 5|4)
    fmt.Println(`XOR`)
    fmt.Printf("%b ^ %b results in %03b\n", 4, 5, 4^5)
    fmt.Printf("%b ^ %b results in %03b\n", 5, 4, 5^4)
    fmt.Println(`AND NOT`)
    fmt.Printf("%b &^ %b results in %03b\n", 7, 5, 7&^5)
    fmt.Printf("%b &^ %b results in %03b\n", 5, 7, 5&^7)
}

运行上述代码生成的输出为:
AND
100 & 101 results in 100
101 & 100 results in 100
OR
100 | 101 results in 101
101 | 100 results in 101
XOR
100 ^ 101 results in 001
101 ^ 100 results in 001
AND NOT
111 &^ 101 results in 010
101 &^ 111 results in 000

最后,&^= 是一个简写的赋值运算符。例如,x = x &^ y 可以被替换为 x &^= y

1

规范表明它们是位清除运算符:

&^   bit clear (AND NOT)    integers

你会将它们用作位标志值的一部分。使用or打开一个位,使用and not关闭它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接