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语言开发的,请微信搜索下方小程序加博主微信群

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值