ホームページ  >  記事  >  バックエンド開発  >  Golang でバイトから個々のビットを抽出するにはどうすればよいでしょうか?

Golang でバイトから個々のビットを抽出するにはどうすればよいでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-04 15:22:02968ブラウズ

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

Golang でバイトからビットを抽出する

バイト間のハミング距離の計算など、多くのタスクでは、バイト内の個々のビットにアクセスする必要があります。バイト。ただし、組み込みの Golang パッケージは、この目的のための直接的な機能を提供しません。

視覚的表現とビット単位の操作

1 つのアプローチは、fmt.Sprintf を使用することです。オンラインのいくつかの回答で示唆されているように、(" b", ...) バイトのバイナリ表現を出力します。ただし、このアプローチはビットの視覚的表現を提供するだけであるため、ビット単位の比較などの演算には適していません。

ビットを取得するためのビット マスキング

ビット単位の演算を実行するには、ビット単位の AND 演算子 (&) をマスキングとともに使用できます。たとえば、バイトの n 番目 ビット (n は 1 から始まります) を取得するには、n 番目 ビットのみが 1 に設定されるマスク m を作成します。このマスクは m = 2**(n-1) として得られます。バイトとマスクをビットごとに AND 演算することで、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。