为了账号安全,请及时绑定邮箱和手机立即绑定

对于二进制分离,哪个更好:使用列表还是 divmod?

对于二进制分离,哪个更好:使用列表还是 divmod?

尚方宝剑之说 2021-08-14 21:35:25
我正在尝试将二进制字符串从末尾除以恒定长度:例如,'1001011000'除以 3-> ['1','001','011','000']。从数字 600 开始,def bin_divby(dec,leng):    n = 0    mid_res = ''    res=list()    for nums in bin(dec)[2:][::-1]:        n+=1        mid_res+=nums        if not n%leng:            res+=[mid_res[::-1]]            mid_res=''    if n%leng:        res+=[mid_res[::-1]]    return res[::-1](我不确定,但代码有点像这样)使用带有少量变量的 for 循环会使其工作,但我很好奇使用 divmod 是否会使其更快。或者基础转换会更好吗?我认为使用二进制形式比通过 divmod 再次重新计算更有效,但正如您所见,我也使用了很多变量和函数。对于重复数千次计算,哪个更好?
查看完整描述

1 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

我们可以为此使用列表理解:


def bin_divby(dec, leng):

    bn = bin(dec)[:1:-1]

    return [bn[i:i+leng][::-1] for i in range(0, len(bn), leng)][::-1]

我们可以通过反转range(..)对象来稍微提高效率:


def bin_divby(dec, leng):

    bn = bin(dec)[:1:-1]

    n = len(bn) - 1

    return [bn[i:i+leng][::-1] for i in range(n - n%leng, -leng, -leng)]

所以这里我们首先反向获取二进制字符串,然后我们迭代该字符串,并且每次对字符串进行切片。最终的结果是相反的。


这产生了预期的:


>>> bin_divby(0b1001011000, 1)

['1', '0', '0', '1', '0', '1', '1', '0', '0', '0']

>>> bin_divby(0b1001011000, 2)

['10', '01', '01', '10', '00']

>>> bin_divby(0b1001011000, 3)

['1', '001', '011', '000']

>>> bin_divby(0b1001011000, 4)

['10', '0101', '1000']

>>> bin_divby(0b1001011000, 5)

['10010', '11000']

>>> bin_divby(0b1001011000, 6)

['1001', '011000']

>>> bin_divby(0b1001011000, 7)

['100', '1011000']


查看完整回答
反对 回复 2021-08-14
  • 1 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信