请问有人能够解释一下在Go语言中使用的<<
和>>
的用法吗?我猜它和其他一些编程语言相似。
超级(可能是过度)简化的定义是,<<
表示“乘以2”,>>
表示“除以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
移位运算符将左操作数按右操作数指定的移位次数进行移位。如果左操作数是有符号整数,则它们实现算术移位;如果左操作数是无符号整数,则它们实现逻辑移位。移位计数必须是无符号整数,移位计数没有上限。移位的行为就好像左操作数按1进行n次移位一样。因此,x << 1相当于x乘以2,x >> 1相当于x除以2但向负无穷截断。这些基本上是 算术运算符,在其他语言中也是相同的,这里有一个基本的 PHP、C、Go 示例。
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
n << x = n * 2^x 示例:3 << 5 = 3 * 2^5 = 96
y >> z = y / 2^z 示例:512 >> 4 = 512 / 2^4 = 32
x := 10
y := uint(1025) // A big shift count
println(x >> y)
println(x << y)
0
0
当C/C++程序运行时,它会打印
5
20
<<
或>>
的行为不同? - user811773<<
表示左移。当左操作数是有符号整数时,>>
表示符号扩展右移;当左操作数是无符号整数时,表示零扩展右移。
为了更好地理解 >>
,可以想象
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表示负数)。
这些是右位运算符和左位运算符
3 << 0
怎么样? - Allan Guwatudde