1. 首页
  2. 主题
  3. Go问与答

求二进制中1的个数,算法看不懂!请教!

lishuailw · · 1404 次点击
```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

用户登录

没有账号?注册

今日阅读排行

    加载中

一周阅读排行

    加载中