在golang中,“&^”运算符是什么?

30

我无法通过谷歌搜索到关于AND NOT的任何有用结果,这个操作符到底是什么,我该如何在像C语言这样的编程语言中使用它?我查阅了规范,并没有找到任何有用的信息,只有一个列表显示它是 &^(AND NOT)。


在什么上下文中? &^ 不是一个独立的运算符,但它可能类似于 7 按位与 按位取反(1) - Adam Smith
我在这里的代码中看到了这个链接,他们将其用于UTF8解码。 - mosmo
2个回答

57
Go表达式x &^ y在C中的等效形式是x & ~y。这意味着"x和(bitwise NOT of y)"。
算术运算符规范章节中,将& ^描述为"bit clear"操作,这给出了你想要使用它的想法。作为两个单独的操作,~y将每个二进制位转换为零,然后清除x中相应的二进制位。每个零位将被转换为一,从而保留x中的相应位。
因此,如果你认为x | y是根据掩码常量y打开x的某些位的方法,则x &^ y则执行相反操作并关闭相同的位。

这是一个非常清晰的解释,特别是使用案例。 - Victor Zamanian
讲解得非常清楚,谢谢。特别是与 |(OR)运算符的比较。 - Abhay Kumar
很好的回答,但“这就是字面上的“x AND(y的按位非)”并不等同于“因此,如果您认为x | y是根据掩码常量y打开x的某些位的方法,则x &^ y正在执行相反的操作并关闭相同的位。” 如果您使用上述两个语句1010 &^ 0011,则会得到不同的结果。 “x AND(y的按位非)”是正确的。 - Mayank
基本上,这意味着,一个位清除操作 b 的意思是,你使用 b 作为一个位序列,其中你将 a 上需要清除的位设置为 1,并将希望保留不变的位设置为 0。b 被用作位清除操作的指南,以显示在 a 上哪些位需要清除。要显示需要清除的位,你在 b 上对应的位上设置为 1。 - XPD

6

&^ 运算符是按位清除(AND NOT):在表达式 z = x &^ y 中,如果 y 的对应位为 1,则 z 的每个位都为 0;否则 z 的每个位等于 x 的对应位。

摘自 《Go 程序设计语言》

示例:

package main
import "fmt"

func main(){
    var x uint8 = 1
    var y uint8 = 1 << 2

    fmt.Printf("%08b\n", x &^ y);

}  

结果:

00000001


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