首页 > 后端开发 > Golang > 正文

如何从 Golang 中的字节中提取各个位?

Barbara Streisand
发布: 2024-11-04 15:22:02
原创
1017 人浏览过

How do you extract individual bits from a byte in Golang?

在 Golang 中从字节中提取位

许多任务,例如计算字节之间的汉明距离,需要访问字节。然而,内置的 Golang 包没有提供用于此目的的直接函数。

视觉表示与按位运算

一种方法是使用 fmt.Sprintf (" b", ...) 打印字节的二进制表示形式,正如网上几个答案所建议的那样。然而,这种方法仅提供位的可视化表示,使其不适合按位比较等操作。

用于检索位的位掩码

要执行按位运算,我们可以利用按位与运算符 (&) 以及掩码。例如,为了获取一个字节的第 nth 位(其中 n 从 1 开始),我们创建一个掩码 m,其中只有第 nth 位设置为 1。此掩码可由 m = 2**(n-1) 获得。通过对字节与掩码进行按位与运算,我们可以确定第 n 位是否已设置:

if (b & m) != 0 {
    // nth bit is set to 1
}
登录后复制

示例代码

以下代码演示了如何使用位掩码从字节中提取位并计算汉明距离:

<code class="go">package main

import "fmt"

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++ {
            // Create a mask to check the (j+1)th bit
            mask := byte(1 << uint(j))
            if (b1 & mask) != (b2 & mask) {
                diff++
            }
        }
    }
    return diff, nil
}

func main() {
    // Example: Compute the Hamming distance between two bytes
    b1 := byte(255) // 11111111
    b2 := byte(0) // 00000000
    distance, err := hamming([]byte{b1}, []byte{b2})
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("Hamming distance:", distance) // Outputs: 8
}</code>
登录后复制

以上是如何从 Golang 中的字节中提取各个位?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板