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

Mat*_*t M 4 operators token go

我一直在寻找大约一周的时间,似乎无法为这两个运营商找到一个合适的解释,&^并且&^=在Go语言中以及如何使用它们.有人会像开导我一样善良吗?

小智 11

当我们查看所有按位运算符时,这更容易理解:

&    bitwise AND
|    bitwise OR
^    bitwise XOR
&^   bit clear (AND NOT)
Run Code Online (Sandbox Code Playgroud)
  1. 按位AND(&):当两个操作数位都为1时,结果为1,否则结果为0.
  2. 按位OR(|):当至少一个操作数位为1时,结果为1,如果两个操作数位为0,则结果为0.
  3. 按位XOR(^):当一个结果为1时,只有一个操作数位为1,否则结果为0.这三个运算符(&, |, ^)产生相同的结果,而与操作数位的顺序无关.
  4. 按位AND NOT(&^):当第一个操作数位为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)
}
Run Code Online (Sandbox Code Playgroud)

运行上面代码生成的输出是:

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
Run Code Online (Sandbox Code Playgroud)

最后,&^=是一个速记赋值运算符.例如,x = x &^ y可以替换为x &^= y