返回介绍

第四十八天

发布于 2023-06-25 22:22:03 字数 4290 浏览 0 评论 0 收藏 0

1.下面代码有什么问题?

type foo struct {
    bar int
}

func main() {
    var f foo
    f.bar, tmp := 1, 2
}

参考答案及解析:编译错误:

    non-name f.bar on left side of :=

:= 操作符不能用于结构体字段赋值。

2.下面的代码输出什么?

func main() {  
    fmt.Println(~2) 
}

参考答案及解析:编译错误。

    invalid character U+007E '~'

很多语言都是采用 ~ 作为按位取反运算符,Go 里面采用的是 ^ 。按位取反之后返回一个每个 bit 位都取反的数,对于有符号的整数来说,是按照补码进行取反操作的(快速计算方法:对数 a 取反,结果为 -(a+1) ),对于无符号整数来说就是按位取反。例如:

func main() {
    var a int8 = 3
    var b uint8 = 3
    var c int8 = -3

    fmt.Printf("^%b=%b %d\n", a, ^a, ^a) // ^11=-100 -4
    fmt.Printf("^%b=%b %d\n", b, ^b, ^b) // ^11=11111100 252
    fmt.Printf("^%b=%b %d\n", c, ^c, ^c) // ^-11=10 2
}

另外需要注意的是,如果作为二元运算符,^ 表示按位异或,即:对应位相同为 0,相异为 1。例如:

func main() {
    var a int8 = 3
    var c int8 = 5
    fmt.Printf("a: %08b\n",a)
    fmt.Printf("c: %08b\n",c)
    fmt.Printf("a^c: %08b\n",a ^ c)
}

给大家重点介绍下这个操作符 &^,按位置零,例如:z = x &^ y,表示如果 y 中的 bit 位为 1,则 z 对应 bit 位为 0,否则 z 对应 bit 位等于 x 中相应的 bit 位的值。

不知道大家发现没有,我们还可以这样理解或操作符| ,表达式 z = x | y,如果 y 中的 bit 位为 1,则 z 对应 bit 位为 1,否则 z 对应 bit 位等于 x 中相应的 bit 位的值,与 &^ 完全相反。

    var x uint8 = 214
    var y uint8 = 92
    fmt.Printf("x: %08b\n",x)     
    fmt.Printf("y: %08b\n",y)       
    fmt.Printf("x | y: %08b\n",x | y)     
    fmt.Printf("x &^ y: %08b\n",x &^ y)

输出:

    x: 11010110
    y: 01011100
    x | y: 11011110
    x &^ y: 10000010

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文