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