2 回答

TA贡献1828条经验 获得超6个赞
该^
运算符是按位补码运算符。规范:算术运算符:
对于整数操作数,一元运算符
+
、-
和^
定义如下:
+x is 0 + x
-x negation is 0 - x
^x bitwise complement is m ^ x with m = "all bits set to 1" for unsigned x
and m = -1 for signed x
所以1
在二进制中是单个 1 位前面全是零:
0000000000000000000000000000000000000000000000000000000000000001
所以按位补码是一个单独的 0 位,前面是全 1:
1111111111111111111111111111111111111111111111111111111111111110
The^1
是一个无类型常量表达式。当它被传递给一个函数时,它必须被转换为一个类型。由于1
是无类型整型常量int
,因此将使用其默认类型。int
在 Go 中使用2 的补码表示,其中负数以 a 开头1
。完整的数字是-1
,数字小一(二进制)是-2
等等。
上面的位模式是 的 2 的补码表示-2
。
要打印位模式和类型,请使用以下代码:
fmt.Println(^1)
fmt.Printf("%T\n", ^1)
fmt.Printf("%064b\n", 1)
i := ^1
fmt.Printf("%064b\n", uint(i))
它输出(在Go Playground上试试):
-2
int
0000000000000000000000000000000000000000000000000000000000000001
1111111111111111111111111111111111111111111111111111111111111110

TA贡献1784条经验 获得超2个赞
好的,这与我们在计算中使用符号的方式有关。
对于一个 1 字节的数字,你可以得到
丁 乙
-8 1000
-7 1001
-6 1010
-5 1011
-4 1100
-3 1101
-2 1110
-1 1111
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
你可以在这里看到 1 等于 0001(没有变化)但 -1 等于 1111。^运算符执行按位异或运算。所以:
0001
1111 xor
-------
1110 -> That is actually -2.
所有这一切都是因为我们用来计算负数的两个补码的约定。当然,这可以外推到更长的二进制数。
您可以使用 Windows 计算器进行异或按位计算来对此进行测试。
- 2 回答
- 0 关注
- 171 浏览
添加回答
举报