我正在尝试计算两个字节之间的汉明距离,这样
HammingDist(byte(255), byte(0)) == 8
我需要每个字节中的位,但我无法在任何内置包中找到这样做的任何函数。那么,给定 byte(1)
我如何获得位表示 00000001?
最佳答案
您可以使用 fmt.Sprintf(%08b, ..)
查看位的可视化表示,正如其他人已经建议的那样。
但是,如果您想在操作中使用这些位,例如计算汉明距离,则需要使用 bitwise operators .
要计算一个字节的第 n 位,您需要将该字节与另一个字节进行 按位与
,该字节的 nth 位设置为 1,其余为 0 (又名掩蔽)。换句话说,另一个字节(掩码)是数字 2^n-1。
例如,要找到数字 13 (00001101) 的第 1 位,我们必须用 2^0 = 1 (00000001) 对其进行掩码。我们将对两个数字执行按位与的输出与掩码进行比较。如果相等,则说明第n位为1,否则为0。我们这样继续下去,找到所有的位。在 Go 代码中说明:
fmt.Print(13 & 1) // Output: 1 -> 1
fmt.Print(13 & 2) // Output: 2 -> 0
fmt.Print(13 & 4) // Output: 4 -> 1
fmt.Print(13 & 8) // Output: 8 -> 1
// Not necessary to continue, but shown for the sake of the example
fmt.Print(13 & 16) // Output: 0 -> 0
fmt.Print(13 & 32) // Output: 0 -> 0
fmt.Print(13 & 64) // Output: 0 -> 0
fmt.Print(13 & 128) // Output: 0 -> 0
因此13在二进制中是00001101
这是我最近编写的一个函数,用于计算两个字节数组之间的汉明距离。在您的情况下,只需传递一个由单个字节组成的数组
func hamming(a, b []byte) (int, error) {
if len(a) != len(b) {
return 0, errors.New("a b are not the same length")
}
diff := 0
for i := 0; i < len(a); i++ {
b1 := a[i]
b2 := b[i]
for j := 0; j < 8; j++ {
mask := byte(1 << uint(j))
if (b1 & mask) != (b2 & mask) {
diff++
}
}
}
return diff, nil
}
去 Playground :https://play.golang.org/p/O1EGdzDYAn
关于go - 我如何从 golang 中的字节中获取位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40308476/