Go 如何反转二进制数?

Go 如何反转二进制数?,go,Go,我是戈兰的新手,对于有经验的戈兰开发人员来说,这应该是一个简单的问题。我试着做一些测试,看看我们在Golang的速度有多快:)最直接的解决方案是将位转换成一个数字,然后通过移位将数字反转。我不确定它会有多快,但它应该能工作 package main import "fmt" import "strconv" func main() { bits := "10100001" bits_number := 8 number, _ := strconv.ParseUint(

我是戈兰的新手,对于有经验的戈兰开发人员来说,这应该是一个简单的问题。我试着做一些测试,看看我们在Golang的速度有多快:)

最直接的解决方案是将位转换成一个数字,然后通过移位将数字反转。我不确定它会有多快,但它应该能工作

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)
}
主程序包
输入“fmt”
导入“strconv”
func main(){
位:=“10100001”
位数:=8
编号:=strconv.ParseUint(位,2,位编号)
r_编号:=编号-编号//储备类型
对于i:=0;i

最直接的解决方案是将位转换成一个数字,然后通过移位将数字反转。我不确定它会有多快,但它应该能工作

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)
}
主程序包
输入“fmt”
导入“strconv”
func main(){
位:=“10100001”
位数:=8
编号:=strconv.ParseUint(位,2,位编号)
r_编号:=编号-编号//储备类型
对于i:=0;i
通常的翻译立即开始

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))
    }
}
主程序包
输入“fmt”
func位反转32(x uint32)uint32{
x=(x&0x5555)1
x=(x&0x33333333)2
x=(x&0x0f0f)4
x=(x&0x00FF00FF)8
返回(x&0x0000FFFF)16
}
func main(){
案例:=[]uint32{0x1,0x100,0x1000,0x1000000,0x10000000,0x80000000,0x89abcdef}
对于u,c:=范围案例{
fmt.Printf(“%08x->%08x\n”,c,位反转32(c))
}
}
通常的翻译立即开始

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))
    }
}
主程序包
输入“fmt”
func位反转32(x uint32)uint32{
x=(x&0x5555)1
x=(x&0x33333333)2
x=(x&0x0f0f)4
x=(x&0x00FF00FF)8
返回(x&0x0000FFFF)16
}
func main(){
案例:=[]uint32{0x1,0x100,0x1000,0x1000000,0x10000000,0x80000000,0x89abcdef}
对于u,c:=范围案例{
fmt.Printf(“%08x->%08x\n”,c,位反转32(c))
}
}

注意:从2013年起,您现在有了一个与

而且它还提供了一系列的功能:不再需要实现


此外,在大多数体系结构上,此包中的函数会被编译器额外识别,并作为内部函数处理,以提高性能

注意:从2013年起,您现在有了一个与的献身活动

而且它还提供了一系列的功能:不再需要实现


此外,在大多数体系结构上,此包中的函数会被编译器额外识别,并作为内部函数处理,以提高性能

假设输入是uint64。解决方案是什么?假设输入是uint64。解决方案是什么?别忘了2017年8月Go 1.9发布的新math/bits软件包。请参阅。别忘了2017年8月Go 1.9版的新math/bits软件包。看见