Search code examples
pythonbinaryradix

For Binary seperation, which would be better:using list or divmod?


I'm trying to divide the binary string from the end, by constant length:for example, '1001011000' by 3->['1','001','011','000']. starting with the number 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]

(I'm not sure but code were kind of like this) Using for loop with few variable would make it work, but I'm curious if using divmod would make it much faster. or would base conversion would be better? I thought using Binary form would be effective than re-calculating once more by divmod, but well as you see, I'm using much variable and functions as well. For repeating thousands of calculations, which would be better?


Solution

  • We can use list comprehension for this:

    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]
    

    we can slightly improve efficiency by reversing the range(..) object:

    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)]
    

    So here we first obtain the binary string in reverse, and then we iterate over that string, and each time slice the string. The end result is reversed.

    This produces the expected:

    >>> 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']