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 중국어 웹사이트의 기타 관련 기사를 참조하세요!