Extracting Bits from a Byte in Golang
Many tasks, such as calculating the Hamming distance between bytes, require access to individual bits within the byte. However, the built-in Golang packages do not provide a direct function for this purpose.
Visual Representation vs. Bitwise Operations
One approach is to use fmt.Sprintf("b", ...) to print a binary representation of the byte, as suggested by several answers online. However, this approach merely provides a visual representation of the bits, making it unsuitable for operations like bitwise comparisons.
Bit Masking for Retrieving Bits
To perform bitwise operations, we can utilize the bitwise AND operator (&) along with masking. For instance, to obtain the nth bit of a byte (where n starts from 1), we create a mask m where only the nth bit is set to 1. This mask can be obtained as m = 2**(n-1). By bitwise ANDing the byte with the mask, we can determine if the nth bit is set:
if (b & m) != 0 { // nth bit is set to 1 }
Sample Code
The following code demonstrates the use of bit masking to extract bits from a byte and calculate the Hamming distance:
<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>
The above is the detailed content of How do you extract individual bits from a byte in Golang?. For more information, please follow other related articles on the PHP Chinese website!