3

我在http://tour.golang.org上关注“GO 之旅” 。表 15 有一些我无法理解的代码。它使用以下语法定义了两个常量:

const (
    Big = 1<<100
    Small = Big>>99
)

我根本不清楚这意味着什么。我尝试修改代码并使用不同的值运行它,以记录更改,但我无法理解那里发生了什么。

然后,它在表 24 上再次使用该运算符。它使用以下语法定义了一个变量:

MaxInt uint64 = 1<<64 - 1

当它打印变量时,它会打印:

uint64(18446744073709551615)

类型在哪里uint64。但我不明白18446744073709551615从哪里来。

4

4 回答 4

11

它们是Go 的按位移位运算符

是对它们如何在 C 中工作的一个很好的解释(它们在多种语言中以相同的方式工作)。基本上1<<64 - 1对应2^64 -1, = 18446744073709551615。

这样想吧。在十进制中,如果你从 001(即 10^0)开始,然后将 1 向左移动,你最终会得到 010,即 10^1。如果你再次移动它,你会以 100 结束,即 10^2。因此,向左移动相当于将移动次数乘以 10。

在二进制中它是一样的,但在基数 2 中,所以 1<<64 表示乘以 2 64 次(即 2 ^ 64)。

于 2012-09-14T13:30:15.750 回答
7

这与 C 系列的所有语言中的相同:有点转变。

请参阅http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts

此操作通常用于将无符号整数乘以或除以 2 的幂:

b := a >> 1 // divides by 2

1<<100很简单2^100(就是大)。

1<<64-1是 2⁶⁴-1,这是您可以用 64 位表示的最大整数(顺便说一下,您不能表示1<<64为 64 位 int,表 15 的要点是证明您可以在 Go 中以数字常量的形式使用它) )。

于 2012-09-14T13:29:09.250 回答
1

>> 和 << 是逻辑移位操作。你可以在这里看到更多关于这些的信息:

http://en.wikipedia.org/wiki/Logical_shift

此外,您可以在其网页中查看所有 Go 运算符

于 2012-09-14T13:33:25.487 回答
1

这是一个合乎逻辑的转变

操作数中的每个位都简单地移动给定数量的位位置,并且空位位置被填充,通常用零

围棋运算符

<<   left shift             integer << unsigned integer
>>   right shift            integer >> unsigned integer
于 2012-09-14T13:30:34.597 回答