首頁  >  文章  >  後端開發  >  如何從 Golang 中的位元組中提取各個位元?

如何從 Golang 中的位元組中提取各個位元?

Barbara Streisand
Barbara Streisand原創
2024-11-04 15:22:021008瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn