加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 09:22:44 所属栏目:大数据 来源:网络整理
导读:我正在尝试计算两个字节之间的汉明距离,这样 HammingDist(字节(255),字节(0))== 8 我需要每个字节中的位,但是我无法在任何内置包中找到任何功能.那么,给定字节(1)我如何获得位表示00000001? 解决方法 您可以使用fmt.Sprintf(?b,..)来查看位的可视化表示,正
我正在尝试计算两个字节之间的汉明距离,这样

HammingDist(字节(255),字节(0))== 8

我需要每个字节中的位,但是我无法在任何内置包中找到任何功能.那么,给定字节(1)我如何获得位表示00000001?

解决方法

您可以使用fmt.Sprintf(?b,..)来查看位的可视化表示,正如其他人已经建议的那样.

但是,如果要在操作中使用这些位,例如计算汉明距离,则需要使用bitwise operators.

要计算一个字节的第n位,您需要将该字节与另一个字节按位AND,其第n位设置为1,其余字节为0(也称为屏蔽).换句话说,该另一个字节(掩码)是数字2 ^ n-1.

例如,要查找数字13(00001101)的第1位,我们必须使用2 ^ 0 = 1(00000001)对其进行掩码.我们将两个数字上执行按位AND的输出与掩码进行比较.如果它们相等,则意味着第n位为1,否则为0.我们继续这样并找到所有位. Go代码中的插图:

fmt.Print(13 & 1) // Output: 1 -> 1
fmt.Print(13 & 2) // Output: 0 -> 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
}

去游乐场:https://play.golang.org/p/O1EGdzDYAn

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读