我正在编写以下代码来计算人口数量,如下所示:
package main
import (
"fmt"
)
func main() {
var pc [256]byte
for i := range pc {
pc[i] = pc[i/2] + byte(i&1)
}
var x uint64 = 65535
var population uint8
for i := 0; i < 8; i++ {
population = population + pc[byte(x>>(i*8))]
}
fmt.Printf("Population Count: %d", population)
}
在编译时出现以下错误:
prog.go:19:39: 无效操作:x >> (i * 8) (移位计数类型 int,必须是无符号整数)
问题在于i初始化 for 循环时声明的变量。的速记初始化i使其成为int内部类型的类型signed int32。这就是为什么下面一行:
population = population + pc[byte(x>>(i*8))]
导致问题。因为移位运算符>>只期望无符号整数,但表达式i*8结果int是 internally signed int32。
因为var不能在for初始化时使用。
for var i uint8 = 0; i < 8; i++ { ... }
语法错误:初始化程序中不允许使用 var 声明
i我可以在 之外声明变量for loop,但我发现它不干净且可读。
实现相同目标的干净方法应该是什么?
明月笑刀无情
相关分类