去<<和>>运营商
有人可以向我解释在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具有相同的效果。 所以我们在最后添加一个零,或者删除最后一个数字