有人能给我解释一下围棋中 <<和 >>的用法吗?我想它和其他一些语言很相似。
<<
>>
从 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 乘以”。
n << x
y >> z
例如,1 << 5是“1乘以2,5乘以”或者32。32 >> 5是“32除以2,5乘以”或者1。
1 << 5
32 >> 5
在 十进制数学中,当我们 乘以或除以10时,我们在数字的末尾加上零。
在 二进制中,2也有同样的效果。所以我们要在末尾加一个零,或者去掉最后一个数字
这些是右位运算符和左位运算符
N < x = n * 2 ^ x 例子:3 < < 5 = 3 * 2 ^ 5 = 96
Y > z = y/2 ^ z 例子:512 > > 4 = 512/2 ^ 4 = 32