Go “围棋”练习的解决方案;“围棋编程语言”;书

Go “围棋”练习的解决方案;“围棋编程语言”;书,go,bitwise-operators,Go,Bitwise Operators,我已经开始阅读《Go编程语言》一书,并从第2章关于位操作的内容中了解到了练习2.6.2。我不完全理解这项任务。所以,从书中“…PopCount将设置的位数返回到1”。这是什么意思?函数的作用是:返回: var pc [256]byte func init() { for i := range pc { pc[i] = pc[i/2] + byte(i&1) fmt.Printf("%d ", pc[i]) } } 0 1 2 1 2 2

我已经开始阅读《Go编程语言》一书,并从第2章关于位操作的内容中了解到了练习2.6.2。我不完全理解这项任务。所以,从书中“…PopCount将设置的位数返回到1”。这是什么意思?函数的作用是:返回:

var pc [256]byte

func init() {
    for i := range pc {
        pc[i] = pc[i/2] + byte(i&1)
        fmt.Printf("%d ", pc[i])
    }
}
0 1 2 1 2 2 3 3 3 4 1 2 2 3 3 3 3 4 2 3 3 4 4 4 4 4 5 1 2 2 3 3 3 4 4 4 5 2 3 3 3 4 4 4 5 3 3 4 4 4 4 5 6 2 2 3 3 3 3 4 4 2 3 4 1 2 3 3 3 4 1 2 4 4 5 2 3 3 4 4 5 5 6 4 4 4 4 4 5 4 5 5 5 6 6 7 1 2 3 3 3 3 3 3 4 4 3 4 3 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5五五六三四四五五五六四五五六六七二三四四四四四五五五六四五五五五五六七四五五五五六六六六六六七八

func PopCount(x uint64) int {
    var unit byte
    for i := uint64(0); i < 8; i++ {
        unit += pc[byte(x>>(i*8))]
    }
    return int(unit)
}
func PopCount(x uint64)int{
变量单位字节
对于i:=uint64(0);i<8;i++{
单位+=pc[字节(x>>(i*8))]
}
返回整数(单位)
}
书中“…使用init()作为所有可能的8位值的初步计算结果表”。请给我解释一下这个操作。下一位作者写了64个步骤。。。他是什么意思?什么是64步?PopCount(x)中的参数
x
——将演示什么


将非常感谢您的回答

第2.6.2节列出了popcount代码:

// pc[i] is the population count of i.
var pc [256]byte

func init() {
    for i := range pc {
        pc[i] = pc[i/2] + byte(i&1)
    }
}

// PopCount returns the population count (number of set bits) of x.
func PopCount(x uint64) int {
    return int(pc[byte(x>>(0*8))] +
        pc[byte(x>>(1*8))] +
        pc[byte(x>>(2*8))] +
        pc[byte(x>>(3*8))] +
        pc[byte(x>>(4*8))] +
        pc[byte(x>>(5*8))] +
        pc[byte(x>>(6*8))] +
        pc[byte(x>>(7*8))])
}
这是一个优化版本
init
为每个可能的字节建立一个填充计数(二进制表示中设置为1的位数)的查找表,并且
PopCount
uint64
中8个字节中的每个字节的填充计数相加

本节后面的练习要求您实现不同的pop count变体,并将其性能与该片段进行比较


具体来说,练习2.4询问如何在64位位置之间移动。给定一个64位int,运行一个循环,该循环迭代64次,每次迭代检查
uint64
的不同位。它统计它看到的所有位被设置为1。您应该实现这一点并比较性能。

popCount是许多处理器中的指令集级操作,它以数字的二进制表示形式返回1的数字。例如:二进制(2)=10=>PopCount(2)=1;binary(7)=111=>popCount(7)=3。8位计算似乎在使用init()预先计算所有8位值的popCount,以便在将来的计算中节省时间。