golang中的"&^"运算符是什么?

mos*_*smo 14 bit-manipulation go

我不能真正谷歌名称和NOT并获得任何有用的结果,这个运算符究竟是什么,我怎么能用像C这样的语言呢?我检查了规范,并没有任何帮助,但有一个列表,它是&^(不是).

Jam*_*dge 25

Go表达式的C等价物x &^ y就是x & ~y.这实际上是" xAND(按位不是y)".

规范算术运算符部分描述&^为"位清除"操作,它给出了您想要使用它的想法.作为两个单独的操作,~y将每一位转换为零,然后将清除相应的位x.每个零位将转换为1,这将保留相应的位x.

因此,如果您认为x | y这是一种x基于掩码常数打开某些位的方法y,那么x &^ y正在执行相反的操作并关闭相同的位.


小智 6

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

来自Go 编程语言

例子:

package main

import "fmt"

func main() {
    var x uint8 = 0b00001111
    var y uint8 = 0b00000100
    var z uint8 = 0b00001011

    if x&^y == z {
        fmt.Printf("  ( x)         (%08b)\n", x)
        fmt.Printf("& (^y)       & (%08b)\n", ^y)
        fmt.Printf("------   =   ------------\n")
        fmt.Printf("  ( z)         (%08b)\n", x&^y)
    }
} 
Run Code Online (Sandbox Code Playgroud)

结果:

  ( x)         (00001111)
& (^y)       & (11111011)
------   =   ------------
  ( z)         (00001011)
Run Code Online (Sandbox Code Playgroud)