Maison > développement back-end > Golang > le corps du texte

Comment extraire des bits individuels d'un octet dans Golang ?

Barbara Streisand
Libérer: 2024-11-04 15:22:02
original
1017 Les gens l'ont consulté

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

Extraire des bits d'un octet en Golang

De nombreuses tâches, telles que le calcul de la distance de Hamming entre les octets, nécessitent l'accès à des bits individuels dans le octet. Cependant, les packages Golang intégrés ne fournissent pas de fonction directe à cet effet.

Représentation visuelle vs opérations au niveau du bit

Une approche consiste à utiliser fmt.Sprintf (" b", ...) pour imprimer une représentation binaire de l'octet, comme le suggèrent plusieurs réponses en ligne. Cependant, cette approche fournit simplement une représentation visuelle des bits, ce qui la rend inadaptée aux opérations telles que les comparaisons au niveau des bits.

Masquage de bits pour récupérer des bits

Pour effectuer des opérations au niveau des bits, nous pouvons utiliser l'opérateur ET au niveau du bit (&) avec le masquage. Par exemple, pour obtenir le nième bit d'un octet (où n commence à 1), on crée un masque m où seul le nième bit est mis à 1. Ce masque peut être obtenu comme m = 2**(n-1). En effectuant l'opération AND au niveau du bit sur l'octet avec le masque, nous pouvons déterminer si le nième bit est défini :

if (b & m) != 0 {
    // nth bit is set to 1
}
Copier après la connexion

Exemple de code

Le le code suivant démontre l'utilisation du masquage de bits pour extraire les bits d'un octet et calculer la distance de Hamming :

<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>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal