我正在尝试理解这段代码,该代码用于返回字节数组以多少个前缀开头的零,但是我不确定0x1是什么。 Google搜索没有帮助,但我假设0x1
返回的第一位?这些叫什么?
此外,我知道这是一个单独的问题,但我认为它并不需要一个新的线程:我不太理解为什么我们在这里嵌套一个循环,移位并从7中减去j。字节如何转换为二进制?
IdLength := 32
func PrefixLen(count [IdLength]byte) int {
for i := 0; i < IdLength; i++ {
for j := 0; j < 8; j++ {
if (count[i]>>uint8(7-j))&0x1 != 0 {
return i*8 + j
}
}
}
return IdLength*8 - 1
}
答案 0 :(得分:3)
0x1
只是数字1
的十六进制表示法。您用&
0x1
取一个整数,以获得其最低有效位(最右边)。使用位掩码时,您写0x1
而不是1
是因为从基数16转换比从基数10转换成基数2更容易。
对于第二个问题,func PrefixLen
所做的是查找count
开头的连续零个数。外循环每次执行一个字节,而内循环处理单独的位:当j = 0时,它向右移7从而从左获得第一位,当j = 1时,其移位6得到第二个位,依此类推上。遇到1
的某个位时,它将返回已检查的位的数量。