Gepser Hoil Asked: 2020-02-28 18:27:22 +0800 CST 2020-02-28 18:27:22 +0800 CST 2020-02-28 18:27:22 +0800 CST Go 中的 >> 和 << 是什么意思? 772 我正在学习Go(golang),发现我不理解变量或常量声明中的这种语法。例如: const ( Big = 1 << 100 Small = Big >> 99 ) 这到底是什么意思? go 2 Answers Voted Best Answer Alvaro Montoro 2020-02-28T18:42:45+08:002020-02-28T18:42:45+08:00 运算符<<和>>是位移运算符,只能应用于整数: <<将在数字右侧添加与运算符后面的值一样多的位(值为 0)。或者相同的是:数字的所有位都将向左移动指定的多个位置。 而且由于一张图片值一千字,这里有一个由 CBurnett 创建的图形解释(来源:维基百科) >>将删除数字右侧的位数,如运算符后面的值所指示的那样。或者相同的是:数字的位将向右移动指定的多个位置(截断相同的次数)。 Cburnett 创建的另一个图形解释(来源:维基百科) 根据算术运算符的Go 文档: 移位运算符将左操作数移位右操作数指定的移位计数。如果左操作数是有符号整数,它们实现算术移位,如果它是无符号整数,它们实现逻辑移位。班次计数没有上限。移位的行为就好像左操作数被移位 n 次,移位计数为 n。结果,x << 1 与 x*2 相同,x >> 1 与 x/2 相同,但被截断为负无穷大。 还有西班牙语翻译(免费的,我希望能被理解): 移位运算符移动左操作数的次数与右操作数指示的次数相同。如果左操作数是有符号整数,它们实现算术移位,如果它是无符号整数,它们实现逻辑移位。对要执行的位移值没有限制。移位的行为就像每次移位 n 时左操作数移位 n 次。因此,x << 1 与 x*2 相同,x >> 1 与 x/2 相同,但被截断为负无穷大。 最后一部分非常重要,因为它允许您创建一个公式,这肯定会帮助您更好地理解它们的作用: 该运算符n << m等价于“n 乘以 2,m 次”= n * 2 m。 运算符n >> m等价于“n 除以 2,m 次”= n * 2 -m。 因此,在您举个例子的情况下: Big= 1 * 2 100 = 1,267,650,600,228,229,401,496,703,205,376(溢出整数)。 Small= Big* 2 -99 = 2 100 * 2 -99 = 2 1 = 2。 Jorgesys 2020-03-02T08:18:27+08:002020-03-02T08:18:27+08:00 <<和>>运算符在 GO 语言中被定义为算术运算符,它们被定义为位移运算符: << 左移位运算符。 >> 右位移运算符。 在我们开始解释按位移位运算符的工作原理之前,让我们记住如何从二进制数中获取十进制值。 例如,1011 0011十进制的值是多少?好吧,根据它从右到左的位置,我们有: 因此,它1011 0011等于179十进制 很重要的一点是,这个运算符除了GO之外还有其他语言存在,比如:Java, php, C,C#等。 解释左移位运算符如何工作的一个简单示例是: 3 << 2其值为12,解释为: 3在二进制中是0011操作指示向左移动 2 个位置,因此: 1100在二进制中结果是12 如果我们执行相反的操作: 12 >> 2结果是3; 12二进制是1100,如果我们向右移动 2 个位置,我们得到0011十进制它是3。 这是Go 语言中的一个示例,您可以从值1(二进制中的值:)中看到0001当执行向左移位时,它的值如何变化: package main import "fmt" func main() { var t , i uint t , i = 1 , 1 for i = 1 ; i < 10 ; i++ { fmt.Printf("%d << %d = %d \n", t , i , t<<i) } } 这将是输出: 1 << 1 = 2 (Valor en binario: 0010) 1 << 2 = 4 (Valor en binario: 0100) 1 << 3 = 8 (Valor en binario: 1000) 1 << 4 = 16 (Valor en binario: 1 0000) 1 << 5 = 32 (Valor en binario: 10 0000) 1 << 6 = 64 (Valor en binario: 100 0000) 1 << 7 = 128 (Valor en binario: 1000 0000) 1 << 8 = 256 (Valor en binario: 1 0000 0000) 1 << 9 = 512 (Valor en binario: 10 0000 0000) 现在以Go 语言执行向右移位的示例: package main import "fmt" func main() { var t , i uint t , i = 1024 , 1 for i = 1 ; i < 10 ; i++ { fmt.Printf("%d >> %d = %d \n", t , i , t>>i) } } 离开: 1024 >> 1 = 512 (Valor en binario: 10 0000 0000) 1024 >> 2 = 256 (Valor en binario: 1 0000 0000) 1024 >> 3 = 128 (Valor en binario: 1000 0000) 1024 >> 4 = 64 (Valor en binario: 100 0000) 1024 >> 5 = 32 (Valor en binario: 10 0000) 1024 >> 6 = 16 (Valor en binario: 1 0000) 1024 >> 7 = 8 (Valor en binario: 1000) 1024 >> 8 = 4 (Valor en binario: 0100) 1024 >> 9 = 2 (Valor en binario: 0010) 更多信息: https ://golang.org/ref/spec#Arithmetic_operators
运算符
<<
和>>
是位移运算符,只能应用于整数:<<
将在数字右侧添加与运算符后面的值一样多的位(值为 0)。或者相同的是:数字的所有位都将向左移动指定的多个位置。而且由于一张图片值一千字,这里有一个由 CBurnett 创建的图形解释(来源:维基百科)
>>
将删除数字右侧的位数,如运算符后面的值所指示的那样。或者相同的是:数字的位将向右移动指定的多个位置(截断相同的次数)。Cburnett 创建的另一个图形解释(来源:维基百科)
根据算术运算符的Go 文档:
还有西班牙语翻译(免费的,我希望能被理解):
最后一部分非常重要,因为它允许您创建一个公式,这肯定会帮助您更好地理解它们的作用:
n << m
等价于“n 乘以 2,m 次”= n * 2 m。n >> m
等价于“n 除以 2,m 次”= n * 2 -m。因此,在您举个例子的情况下:
Big
= 1 * 2 100 = 1,267,650,600,228,229,401,496,703,205,376(溢出整数)。Small
=Big
* 2 -99 = 2 100 * 2 -99 = 2 1 = 2。<<和>>运算符在 GO 语言中被定义为算术运算符,它们被定义为位移运算符:
<< 左移位运算符。
>> 右位移运算符。
在我们开始解释按位移位运算符的工作原理之前,让我们记住如何从二进制数中获取十进制值。
例如,
1011 0011
十进制的值是多少?好吧,根据它从右到左的位置,我们有:因此,它
1011 0011
等于179
十进制很重要的一点是,这个运算符除了GO之外还有其他语言存在,比如:
Java
,php
,C
,C#
等。解释左移位运算符如何工作的一个简单示例是:
3 << 2
其值为12
,解释为:3
在二进制中是0011
操作指示向左移动 2 个位置,因此:1100
在二进制中结果是12
如果我们执行相反的操作:
12 >> 2
结果是3
;12
二进制是1100
,如果我们向右移动 2 个位置,我们得到0011
十进制它是3
。这是Go 语言中的一个示例,您可以从值
1
(二进制中的值:)中看到0001
当执行向左移位时,它的值如何变化:这将是输出:
现在以Go 语言执行向右移位的示例:
离开:
更多信息: https ://golang.org/ref/spec#Arithmetic_operators