Go < < and > 运算符

有人能给我解释一下围棋中 <<>>的用法吗?我想它和其他一些语言很相似。

99516 次浏览

http://golang.org/doc/go_spec.html的规范来看,似乎至少对于整数来说,这是一个二进制移位。例如,二进制0b00001000 > 1将是0b0000100,而0b00001000 < < 1将是0b000010000。


Go 显然不接受二进制整数的0b 表示法。我只是举个例子。在十进制中,8 > > 1是4,8 < < 1是16。左移一等于乘以二,右移一等于除以二,去掉任何余数。

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

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

换班操作员向左移动 操作数按指定的移位计数 他们实现了 如果左操作数,则算术移位 是一个有符号整数和逻辑移位 如果它是一个无符号整数 班次计数必须是未签名的 上没有上限 转移计数。转移的行为就好像 左操作数被移动 n 次 对于 n 的移位计数为1,因此, X < 1与 x * 2和 x > 1相同 和 x/2一样,但是被截断了 走向负无穷大。

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

为了更好的理解 >>的想法

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)。

Go 的 < < 和 > > 类似于其他语言中的移位(即: 除法或乘以2的幂) ,但是因为 Go 是一种比 C/C + + 更安全的语言,所以当移位计数为数字时,它会做一些额外的工作。

X86 CPU 中的 Shift 指令只考虑5位(64位 x86 CPU 上为6位)的 Shift 计数。在像 C/C + + 这样的语言中,shift 操作符转换为单个 CPU 指令。

下面的 Go 代码

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

指纹

0
0

而 C/C + + 程序会打印

5
20

他们基本上是 算术运算符和它的其他语言在这里相同的是一个基本的 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

超级(可能超级)简化的定义是,<<用来表示“乘以2”,而 >>用来表示“除以2”——后面的数字是乘以多少。

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

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

十进制数学中,当我们 乘以或除以10时,我们在数字的末尾加上零。

二进制中,2也有同样的效果。所以我们要在末尾加一个零,或者去掉最后一个数字

这些是右位运算符和左位运算符

N < x = n * 2 ^ x 例子:3 < < 5 = 3 * 2 ^ 5 = 96

Y > z = y/2 ^ z 例子:512 > > 4 = 512/2 ^ 4 = 32