package main
import (
"fmt"
"strings"
)
// ReverseBits reverses exactly 32 bits of a uint32
func ReverseBits(n uint32) uint32 {
bin := fmt.Sprintf("%032b", n)
runes := []rune(bin)
// reverse the slice
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
var result uint32
fmt.Sscanf(string(runes), "%b", &result)
return result
}
// Bits formats a uint32 into 4 groups of 8 bits
func Bits(n uint32) string {
bin := fmt.Sprintf("%032b", n)
parts := []string{
bin[0:8],
bin[8:16],
bin[16:24],
bin[24:32],
}
return strings.Join(parts, " ")
}
func main() {
a := uint32(19)
b := uint32(3)
ra := ReverseBits(a)
rb := ReverseBits(b)
fmt.Println("Original 19:", Bits(a))
fmt.Println("Reversed 19:", Bits(ra))
fmt.Println()
fmt.Println("Original 3: ", Bits(b))
fmt.Println("Reversed 3: ", Bits(rb))
}
/*
run:
Original 19: 00000000 00000000 00000000 00010011
Reversed 19: 11001000 00000000 00000000 00000000
Original 3: 00000000 00000000 00000000 00000011
Reversed 3: 11000000 00000000 00000000 00000000
*/