>  기사  >  백엔드 개발  >  Golang의 바이트에서 개별 비트를 어떻게 추출합니까?

Golang의 바이트에서 개별 비트를 어떻게 추출합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-04 15:22:02969검색

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

Golang의 바이트에서 비트 추출

바이트 간 해밍 거리 계산과 같은 많은 작업에는 Golang 내의 개별 비트에 대한 액세스가 필요합니다. 바이트. 그러나 내장된 Golang 패키지는 이러한 목적을 위한 직접적인 기능을 제공하지 않습니다.

시각적 표현과 비트별 연산

한 가지 접근 방식은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.