如何反转二进制数?

时间:2013-08-16 23:40:17

标签: go

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

3 个答案:

答案 0 :(得分:6)

通常的bit-twiddling C solutions会立即转换为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))
    }
}

答案 1 :(得分:2)

注意:自2013年起,您现在拥有math/bits package专用Go 1.9 (August 2017)

它确实附带了Reverse()ReverseBytes()函数的集合:不再需要实现它了。

另外,在大多数体系结构中,编译器还会识别此程序包中的函数,并将其视为内在函数以获得额外的性能。

答案 2 :(得分:1)

最直接的解决方案是将位转换为strconv的数字,然后通过移位来反转数字。我不确定它会有多快,但它应该有效。

package main

import "fmt"
import "strconv"

func main() {
    bits := "10100001"
    bits_number := 8
    number, _ := strconv.ParseUint(bits, 2, bits_number)
    r_number := number - number // reserve type
    for i := 0; i < bits_number; i++ {
        r_number <<= 1
        r_number |= number & 1
        number >>= 1
    }
    fmt.Printf("%s [%d]\n", strconv.FormatUint(r_number, 2), r_number)
}

http://play.golang.org/p/YLS5wkY-iv