Mengekstrak Bit daripada Byte dalam Golang
Banyak tugas, seperti mengira jarak Hamming antara bait, memerlukan akses kepada bit individu dalam bait. Walau bagaimanapun, pakej Golang terbina dalam tidak menyediakan fungsi langsung untuk tujuan ini.
Perwakilan Visual vs. Operasi Bitwise
Satu pendekatan ialah menggunakan fmt.Sprintf (" b", ...) untuk mencetak perwakilan binari bait, seperti yang dicadangkan oleh beberapa jawapan dalam talian. Walau bagaimanapun, pendekatan ini hanya memberikan gambaran visual bit, menjadikannya tidak sesuai untuk operasi seperti perbandingan bitwise.
Bit Masking untuk Mendapatkan Bit
Untuk melaksanakan operasi bitwise, kita boleh menggunakan operator bitwise AND (&) bersama-sama dengan masking. Sebagai contoh, untuk mendapatkan bit nth bait (di mana n bermula dari 1), kami mencipta mask m di mana hanya bit nth ditetapkan kepada 1. Topeng ini boleh didapati sebagai m = 2**(n-1). Dengan bitwise ANDing byte dengan mask, kita boleh menentukan sama ada bit nth ditetapkan:
if (b & m) != 0 { // nth bit is set to 1 }
Contoh Code
The kod berikut menunjukkan penggunaan bit masking untuk mengekstrak bit daripada bait dan mengira jarak 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>
Atas ialah kandungan terperinci Bagaimanakah anda mengekstrak bit individu daripada bait dalam Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!