在golang中,^0是什么?

11
我看到代码库中有^0。
示例:
type stat struct {
  ...
  min int64
  ...
}

newStat := stat{min: ^0}

^0是什么意思?

1个回答

27
根据文档

^x 按位取反 对于无符号x,m =“所有位都设为1” ,对于有符号x,m = -1

所以^x会翻转x的每一个位,例如 0101 变成 1010。这意味着^0与其他主流语言中的~0相同。

当使用二进制补码来表示负数(大多数编程语言都是这样做的)时,零的按位补码值(即所有位都为1)为-1。因此这是一种写法:

newStat := stat{min: -1}

4
按位取反是指对于一个数据类型中的每个比特位进行反转。例如,4位二进制中的0为0000,其按位补码为1111;同样地,4位二进制中的10为1010,其补码为0101。 - Murilo Vasconcelos
1
更多参考,请阅读有关按位运算的一般信息。 - justinas
非常感谢。这可能听起来很愚蠢,但位运算的意义是什么?为什么他们不只是写stat{min: -1}而是要费力地写^0? - samol
我不知道你从哪里得到那段代码,但我猜想是因为他们想要这么做。这并不是一件非常高级的事情,而且显示了语言的一个特性。有些情况下,使用位运算比简单的算术运算更快。例如,你可以搜索“xor eax,eax”的例子。但在你的例子中绝对不是这种情况。 - Murilo Vasconcelos
4
我的猜测是:他们没有像通常使用整数一样(用于计数)使用“min”,而是将其作为一组位来使用。如果最后一位是1,它表示某些东西;如果倒数第二位是1,它表示其他某些东西,如此类推。在Go语言中,这种风格的代码可能会使用“1<<iota”作为常量。总之,“^0”可以说更好地传达了“一个所有位都设置为1的整数”的意思,而不是“-1”。 - Tyler
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接