1

我是 Golan 的新手,对于有经验的 golang 开发人员来说,这应该是一个简单的问题。我尝试从 Spotify 做同样的测试,看看我们在 Golang 中能走多快 :)

4

3 回答 3

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))
    }
}
于 2013-08-17T08:48:44.467 回答
2

注意:自 2013 年以来,您现在拥有一个带有Go 1.9(2017 年 8 月)的专用math/bits

它确实带有一组Reverse()ReverseBytes()函数:不再需要实现一个。

此外,在大多数架构上,此包中的函数还被编译器识别并被视为内在函数以提高性能。

于 2017-08-27T17:29:31.717 回答
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

于 2013-08-17T00:41:15.763 回答