大多数编程语言使用
~
来表示一元按位非运算。相比之下,Go 使用 ^
:
fmt.Println(^1) // Prints -2
为什么 Go 设计者决定在这里打破惯例?
因为 ^x 等价于 m ^ x,其中对于无符号 x,m =“所有位设置为 1”,对于有符号 x,m = -1。 规范中是这么说的。
这类似于 -x 是 0 - x
^
运算符类似于 +
和 -
运算符。例如:
+x == +0x0 + x
+x == 0x0 + x
-x == -0x0 - x
-x == 0x0 - x
^x == ^0x0 ^ x
^x == 0xF ^ x
所以
^0 ^ x
等于^x
。因为 0
不会更改 ^
操作中的值,其方式类似于 0
不会更改 +
和 -
操作中的值。