运营商的"'和">>做什么?

Zag*_*rax 3 operators go

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

const (
    Big = 1<<100
    Small = Big>>99
)
Run Code Online (Sandbox Code Playgroud)

它根本不清楚我的含义.我试图修改代码并使用不同的值运行它来记录更改,但我无法理解那里发生了什么.

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

MaxInt uint64 = 1<<64 - 1

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

uint64(18446744073709551615)

uint64类型在哪里.但我无法理解18446744073709551615从哪里来.

Pao*_*lla 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).


Den*_*ret 7

这与C系列的所有语言都是一样的:有点转变.

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

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

b := a >> 1 // divides by 2
Run Code Online (Sandbox Code Playgroud)

1<<100很简单2^100(那很大).

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