运营商的<<<'和'>>'做?

时间:2012-09-14 13:24:22

标签: operators go

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

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

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

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

MaxInt uint64 = 1<<64 - 1

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

uint64(18446744073709551615)

uint64的类型。但我无法理解18446744073709551615的来源。

4 个答案:

答案 0 :(得分:11)

他们是Go's bitwise shift operators

Here很好地解释了它们如何为C工作(它们以多种语言以相同的方式工作)。 基本上1<<64 - 1对应于2 ^ 64 -1,= 18446744073709551615。

这样想。如果从001(即10 ^ 0)开始然后将1向左移动,则以十进制表示,最终得到010,即10 ^ 1。如果再次移动,则以100结尾,即10 ^ 2。所以向左移动相当于乘以你移动次数的10倍。

在二进制中它是相同的,但在基数2中,所以1&lt;&lt; 64意味着乘以2 64次(即2 ^ 64)。

答案 1 :(得分: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)中证明你可以用数值常数得到它。

答案 2 :(得分:1)

这是logical shift

  

操作数中的每一位都只是移动了给定的位数   职位和空缺职位都填写,通常是   零

Go Operators

<<   left shift             integer << unsigned integer
>>   right shift            integer >> unsigned integer

答案 3 :(得分:1)

&gt;&gt;和&lt;&lt;是逻辑转移操作。你可以在这里看到更多关于这些的信息:

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

此外,您可以检查webpage

中的所有Go运算符