在这个例子中,这个位移是如何工作的?

时间:2016-08-08 01:33:01

标签: go bit bit-shift

我正在浏览golang.org上的go教程,我遇到了一个我部分理解的例子......

MaxInt uint64     = 1<<64 - 1

现在我理解这是将64位放到左边,这将使它成为1,然后是64 0。

我的问题是为什么这是64位数字可以达到的最大整数。最大整数不是111111111....(until the 64th 1)而不是100000...(until the 64th one)吗?

1 个答案:

答案 0 :(得分:1)

这里一步一步地发生了什么:

  1. 选1。

  2. 将其移至左侧64位。这很棘手。结果实际上需要65位表示 - 即1后跟64个零。既然我们在这里计算64位值,为什么这甚至编译而不是溢出到0或1或产生编译错误?

  3. 它的工作原理是因为用于计算Go中常量的算法有点神奇(https://blog.golang.org/constants),因为它与计算的命名常量的类型无关。您可以说foo uint8 = 1<<415 / 1<<414foo现在是2

  4. 减去1.这将我们带回64位数字,因为它实际上是11 .... 1(64次),这确实是uint64的最大值。如果没有这一步,编译器会抱怨我们试图将65位值填入uint64

  5. 将常量命名为MaxInt,并为其指定uint64类型。成功了!

  6. 用于计算常数的神奇算法仍有局限性(显然)。大于500的移位会产生有趣的名为stupid shift错误。