为什么 Go 中的 -2 & -1 等于 -2?
Why is -2 & -1 equal to -2 in Go?
为什么 -2&-1 会导致 -2?
我假设 0010 和 0001 会产生 0000。当数字为正时确实如此。
fmt.Printf("%b, %b, %v\n", -2, -1, -2&-1)
// shows: -10, -1, -2
这实际上是一个关于数字在计算机中如何表示的问题,而不是关于围棋的问题。你会从其他 languages/environments 得到相同的结果,比如 C 或 Python.
为简单起见,我们假设 8 位。 -2 在二进制中是 11111110
(使用 two's complement,这是现代机器中表示负整数的标准方式)。 -1 在二进制中是 11111111
。其中的AND
是11111110
,也就是-2.
实际上 Go 整数可能是 32 位或 64 位,但这不会改变答案。只需在上述表示形式的左侧添加一串 1 即可。结果仍然是 1111....1110
即 -2.
我认为您被 https://golang.org/pkg/fmt/#hdr-Printing 中的细则欺骗了:
%b
在格式字符串中代表“base 2”,而不是“binary”。您得到的是基数 2 中有符号值的(符号)表示:-10
,而不是内存中实际位的表示。
查看二进制布局的一种方法是转换为值的无符号变体:
var i int32 = -2
fmt.Printf("base2 = %b\n", i)
fmt.Println("casting to unsigned :")
fmt.Printf("base2 = %b\n", uint32(i))
// Output:
// base2 = -10
// casting to unsigned :
// base2 = 11111111111111111111111111111110
https://play.golang.org/p/nfxS7Tv5HuL
注意:这同样适用于带有符号整数的 %x
:您得到 -2
(以 16 为基数的值表示),而不是 fffffffe
.
为什么 -2&-1 会导致 -2? 我假设 0010 和 0001 会产生 0000。当数字为正时确实如此。
fmt.Printf("%b, %b, %v\n", -2, -1, -2&-1)
// shows: -10, -1, -2
这实际上是一个关于数字在计算机中如何表示的问题,而不是关于围棋的问题。你会从其他 languages/environments 得到相同的结果,比如 C 或 Python.
为简单起见,我们假设 8 位。 -2 在二进制中是 11111110
(使用 two's complement,这是现代机器中表示负整数的标准方式)。 -1 在二进制中是 11111111
。其中的AND
是11111110
,也就是-2.
实际上 Go 整数可能是 32 位或 64 位,但这不会改变答案。只需在上述表示形式的左侧添加一串 1 即可。结果仍然是 1111....1110
即 -2.
我认为您被 https://golang.org/pkg/fmt/#hdr-Printing 中的细则欺骗了:
%b
在格式字符串中代表“base 2”,而不是“binary”。您得到的是基数 2 中有符号值的(符号)表示:-10
,而不是内存中实际位的表示。
查看二进制布局的一种方法是转换为值的无符号变体:
var i int32 = -2
fmt.Printf("base2 = %b\n", i)
fmt.Println("casting to unsigned :")
fmt.Printf("base2 = %b\n", uint32(i))
// Output:
// base2 = -10
// casting to unsigned :
// base2 = 11111111111111111111111111111110
https://play.golang.org/p/nfxS7Tv5HuL
注意:这同样适用于带有符号整数的 %x
:您得到 -2
(以 16 为基数的值表示),而不是 fffffffe
.