我在http://tour.golang.org跟随'GO之旅'。 表15有一些我无法理解的代码。它使用以下语法定义两个常量:
const (
Big = 1<<100
Small = Big>>99
)
对我来说,它根本不清楚它意味着什么。我尝试修改代码并使用不同的值运行它来记录更改,但我无法理解那里发生了什么。
然后,它在表24上再次使用该运算符。它使用以下语法定义变量:
MaxInt uint64 = 1<<64 - 1
当它打印变量时,它会打印:
uint64(18446744073709551615)
uint64
的类型。但我无法理解18446744073709551615
的来源。
答案 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)
操作数中的每一位都只是移动了给定的位数 职位和空缺职位都填写,通常是 零
<< 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运算符