我是 Golan 的新手,对于有经验的 golang 开发人员来说,这应该是一个简单的问题。我尝试从 Spotify 做同样的测试,看看我们在 Golang 中能走多快 :)
问问题
2703 次
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)
}
于 2013-08-17T00:41:15.763 回答