问题
拿到一个二进制字符串如何快速高效的转化为十进制数呢?如“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地址,欢迎相互沟通学习!