转到<<和>>运算符

| 有人可以告诉我Go中
<<
>>
的用法吗?我猜它与其他一些语言相似。     
已邀请:
超级(可能超过)的简化定义是,“ 0”用于\“乘以2 \”,而“ 1”用于“除以2””,其后的数字是多少次。 因此
n << x
是“ n乘2,x乘”。
y >> z
是“ y除以2,z倍”。 例如,
1 << 5
是“ 1乘2、5倍”或32。而
32 >> 5
是“ 32除以2、5倍”或1。 所有其他答案都给出了更多的技术定义,但没人能直截了当地提出来,我认为您可能想要这样。     
根据http://golang.org/doc/go_spec.html上的规范,似乎至少对于整数而言,这是一个二进制移位。例如,二进制0b00001000 >> 1将是0b00000100,而0b00001000 << 1将是0b00010000。 Go显然不接受二进制整数的0b表示法。我只是将其用作示例。用十进制表示,8 >> 1是4,8 << 1是16。向左移一位等于乘以2,向右移一位等于除以2,则舍去任何余数。     
<<和>>运算符是Go算术运算符。
<<   left shift             integer << unsigned integer
>>   right shift            integer >> unsigned integer
  移位运算符向左移位   通过指定的移位计数操作数   通过正确的操作数。他们实施   算术移位如果左操作数   是有符号整数和逻辑移位   如果它是一个无符号整数。的   班次计数必须是无符号的   整数。没有上限   班次计数。换档的行为就像   左操作数移位n次   1,移位计数为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)
    }

}
GO演示 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 
    
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
    
<<
是左移。当左操作数是有符号整数时,
>>
是符号扩展的右移,而当左操作数是无符号整数时,
>>
是零扩展的右移。 为了更好地理解
>>
var u uint32 = 0x80000000;
var i int32 = -2;

u >> 1;  // Is 0x40000000 similar to >>> in Java
i >> 1;  // Is -1 similar to >> in Java
因此,当应用于无符号整数时,左侧的位将填充零,而应用于有符号整数时,左侧的位将填充最左侧的位(当有符号整数按2表示负值时,该位为1 \的补码)。     
在十进制数学中,当我们乘以10或除以10时,会在数字末尾产生零。 在二进制中,2具有相同的作用。因此,我们在末尾添加零,或删除最后一位     

要回复问题请先登录注册