【发布时间】:2019-04-03 03:05:59
【问题描述】:
我正在编写以下代码来计算人口计数,如下所示:
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 内部为 signed int32。
由于var不能用于for初始化。
for var i uint8 = 0; i < 8; i++ { ... }
语法错误:初始化器中不允许 var 声明
我可以在for loop 之外声明变量i,但我觉得它不干净且可读。
实现相同目标的干净方法应该是什么?
【问题讨论】:
标签: go