GO二进制字符串转十进制数原生算法

问题

拿到一个二进制字符串如何快速高效的转化为十进制数呢?如“111”如何转成十进制的7?

go语言自带包strconv

这个包呢也有其转换方式,太多的博客啊写的都是这个包,但是他的耗时太长了,并且性能并不行,比如一个包需要调用几百万几千万此这个包就吃力了

原生算法

代码一

func Str2DEC(s string) (num int) {
	l := len(s)
	for i := l - 1; i >= 0; i-- {
		num += (int(s[l-i-1]) - 48) << uint8(i)
	}
	return
}
  • 遍历字符串从索引0开始取
  • 原生算法比如二进制1101,换算成十进制就是:12(1-1)+02(2-1)+12(3-1)+12(4-1)=1+0+4+8=13。

代码二

再次优化运行耗时,用&运算。

func Str2DEC(s string) (num int) {
	l := len(s)
	for i := l - 1; i >= 0; i-- {
		num += (int(s[l-i-1]) & 0xf) << uint8(i)
	}
	return
}

相比之下第二种方法比第一种快1/4,以上两种都快,可以用一百万次或一千万次来计算耗时strconv包一百万次的耗时是48-70ms,此算法在1-10ms之间,需要看你传递的二进制字符越长耗时越高

结束

这样的算法需要在你能确定传进来的字符串一定是二进制字符,否则算出来的数值就要到火星。。。
另外原创帖,请转载的朋友联系博主。友情链接有我的博客和github地址,欢迎相互沟通学习!

你可能感兴趣的:(go,字符转化,二进制换十进制,binary,golang,Go)