去<<和>>运营商

有人可以向我解释在Go上使用<<>>吗? 我猜这跟其他一些语言差不多

http://golang.org/doc/go_spec.html的规范来看,似乎至less是整数,这是一个二进制转换。; 例如,二进制0b00001000 >> 1将是0b00000100,并且0b00001000 << 1将是0b00010000。


显然不接受二进制整数的0b表示法。 我只是用它作为例子。 在十进制中,8 >> 1是4,8 << 1是16.左移1与2相乘,右移1除以2相除,舍去余数。

super(可能over)的简化定义就是<<用于“times 2”,而>>用于“by 2” – 之后的数字是多less次。

所以n << x是“n次2次x次”。 y >> z是“y除以2,z次”。

例如, 1 << 5是“1次2,5次”或32,而32 >> 5是“32除以2,5次”或1。

所有其他答案给出了更多的技术定义,但是没有人真正直截了当地说出来,我想你可能会想要这样做。

<<和>>运算符是Go算术运算符 。

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

移位操作符将左操作数移位右操作数指定的移位计数。 如果左操作数是一个有符号的整数,它们将执行算术移位,如果它是一个无符号整数,则执行逻辑移位。 移位计数必须是无符号整数。 换class次数没有上限。 换档的行为就像左操作数被n次移位n次,换位次数为n。 结果,x << 1与x * 2相同,x >> 1与x / 2相同,但是被截断为负无穷。

它们基本上是算术运算符 ,在其他语言中相同,这里是一个基本的PHP,C,Go示例

 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) } fmt.Println() t = 512 for i = 1 ; i < 10 ; i++ { fmt.Printf("%d >> %d = %d \n", t , i , t>>i) } } 

去演示

C

 #include <stdio.h> int main() { int t = 1 ; int i = 1 ; for(i = 1; i < 10; i++) { printf("%d << %d = %d \n", t, i, t << i); } printf("\n"); t = 512; for(i = 1; i < 10; i++) { printf("%d >> %d = %d \n", t, i, t >> i); } return 0; } 

C演示

PHP

 $t = $i = 1; for($i = 1; $i < 10; $i++) { printf("%d << %d = %d \n", $t, $i, $t << $i); } print PHP_EOL; $t = 512; for($i = 1; $i < 10; $i++) { printf("%d >> %d = %d \n", $t, $i, $t >> $i); } 

PHP演示

他们都会输出

 1 << 1 = 2 1 << 2 = 4 1 << 3 = 8 1 << 4 = 16 1 << 5 = 32 1 << 6 = 64 1 << 7 = 128 1 << 8 = 256 1 << 9 = 512 512 >> 1 = 256 512 >> 2 = 128 512 >> 3 = 64 512 >> 4 = 32 512 >> 5 = 16 512 >> 6 = 8 512 >> 7 = 4 512 >> 8 = 2 512 >> 9 = 1 

<<左移。 >>是左操作数为有符号整数时的符号扩展右移,左操作数为无符号整数时为零扩展右移。

为了更好地理解>>想想

 var u uint32 = 0x80000000; var i int32 = -2; u >> 1; // Is 0x40000000 similar to >>> in Java i >> 1; // Is -1 similar to >> in Java 

因此,当应用于无符号整数时,左侧的位用0填充,而应用于有符号整数时,左侧的位用最左边的位填充(当符号整数为负数时,为2补充)。

Go的<<和>>类似于其他语言的移位(即:除法或乘以2的幂),但是因为Go比C / C ++更安全,所以当移位计数是一个数。

x86 CPU中的移位指令仅考虑移位计数的5位(64位x86 CPU上的6位)。 在像C / C ++这样的语言中,移位运算符转换为单个CPU指令。

以下Go代码

 x := 10 y := uint(1025) // A big shift count println(x >> y) println(x << y) 

版画

 0 0 

而C / C ++程序将打印

 5 20 

十进制math中 ,当我们乘以或除以10时 ,我们影响数字的末尾的零。

二进制中2具有相同的效果。 所以我们在最后添加一个零,或者删除最后一个数字