Answers:
超级(可能超过)简化定义仅<<
用于“时间2”,并且>>
并且用于“除以2”,其后的数字是多少次。
因此n << x
,“ n乘以2,x乘以”。和y >> z
是“ y除以2,z倍”。
例如,1 << 5
是“ 1 32 >> 5
乘2、5乘”或32。并且是“ 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,则舍去任何余数。
它们基本上是算术运算符,在其他语言中的含义相同,这里是基本的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;
}
的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);
}
他们都会输出
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补充)。