如何反转二进制数?

nXq*_*Xqd 1 go

我是戈兰的新手,对于经验丰富的golang开发者来说,这应该是一个简单的问题.我尝试从Spotify同样的测试,看看我们在Golang中的速度有多快:)

Pau*_*kin 6

通常比特笨拙的C解决方案立即转换为Go.

package main

import "fmt"

func BitReverse32(x uint32) uint32 {
    x = (x&0x55555555)<<1 | (x&0xAAAAAAAA)>>1
    x = (x&0x33333333)<<2 | (x&0xCCCCCCCC)>>2
    x = (x&0x0F0F0F0F)<<4 | (x&0xF0F0F0F0)>>4
    x = (x&0x00FF00FF)<<8 | (x&0xFF00FF00)>>8
    return (x&0x0000FFFF)<<16 | (x&0xFFFF0000)>>16
}

func main() {
    cases := []uint32{0x1, 0x100, 0x1000, 0x1000000, 0x10000000, 0x80000000, 0x89abcdef}
    for _, c := range cases {
        fmt.Printf("%08x -> %08x\n", c, BitReverse32(c))
    }
}
Run Code Online (Sandbox Code Playgroud)