Go面试题48

Posted by     "" on Monday, January 13, 2020

Go面试题48

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

type foo struct {
    bar int
}

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

2: 下面代码输出什么?

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

参考答案及解析

1: 答案及解析: 编译错误: non-name f.bar on left side of :=, := 操作符不能用于结构体字段赋值.

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("a: %08b\n", c)
    fmt.Printf("a^c: %08b\n", a ^ c)
}

给大家重点介绍下这个操作符&^, 按位置零, 例如: z = x &^ y, 表示如果y中的bit位为1, 则z对应bit0, 否则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", x  | y)
fmt.Printf("x &^ y: %08b\n", x &^ y)

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

使用微信扫描二维码完成支付