```go
package main
import "fmt"
var pc [256]byte
func init() {
for i := range pc {
//这句核心语法我是实在看不懂了,这里的i到底等于什么值啊?是ha=27对应的二进制数“11011”还是啥?这里的i不是只是对应数字的序列号吗?为啥是i/2?为啥是byte(i&1)?
pc[i] = pc[i/2] + byte(i&1)
}
}
func main() {
var ha uint64
ha=27
fmt.Printf("二进制:%b\n",ha)
shu:=pc[ha]
fmt.Printf("shu的值:%v\n",shu)
}
```
结果
```go
二进制:11011
shu的值:4
```
这个很简单啊,有啥看不懂的……
```
pc[0]=0
pc[1]=pc[0]+1 //1
pc[2]=pc[1]+0 //1
```
保证了0,1,2三个都是对的
当i>2时
pc[n]等于 pc[n/2]+最后一位是否为1
pc n/2代表 2进制时前N位的累积
在加上最后以为,那么自然就是各个位上的数的总和了。
里面唯一要注意的点就是,整数操作的 / 是不计余数的整除,以及 byte是无符号的,byte(i&1)的值是0或1
#2
更多评论
换成10进制罗嗦的伪代码算法给你对比下吧
```
for i := range pc {
sum[i] = sum[Math.Floor(i/10)] +(i % 10)
}
```
#3