go - 我如何从 golang 中的字节中获取位?

标签 go

我正在尝试计算两个字节之间的汉明距离,这样

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/

相关文章:

go - 如何在 Hana DB - SAP 上连接 SSL [SQL 错误 4321 - 仅允许安全连接]

go - 如何发布一个 Go 包

go - 包含空结构的名为 "_"(下划线)的字段的用途是什么?

go - 覆盖外部包的 cgo 编译器和链接器标志?

json - 在 Go 中编码为 JSON 时如何强制采用十进制格式的 float

go - 如何在 GoSublime 中禁用 func init() 自动完成功能?

function - 重新分配指针函数参数

go - 不能在 db.Query 的参数中使用缓冲区(类型 bytes.Buffer)作为类型字符串

sql - 如何以一种好的方式使用 SQL NULL 值和 JSON?

go - 为什么不能同时为结构及其指针定义方法?