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
对应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", x | y)
fmt.Printf("x &^ y: %08b\n", x &^ y)
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付