解决方案
不将数字转换为字符串的解决方案:
x = 0b0010001111111011001000000101100010101010000101101011111000000000
numbers = list((x >> i) & 0xFF for i in range(0,64,8))
print(numbers) # [0, 190, 22, 170, 88, 32, 251, 35]
print(list(reversed(numbers))) # [35, 251, 32, 88, 170, 22, 190, 0]
解释
在这里我使用了列表推导式,在i
的增量上循环8次。因此,i
取值为0, 8, 16, 24, 32, 40, 48, 56
。
每次,位移运算符>>
临时将数字x
向下移动i
位。这相当于除以256^i
。
因此,得到的数字是:
i = 0: 0010001111111011001000000101100010101010000101101011111000000000
i = 8: 00100011111110110010000001011000101010100001011010111110
i = 16: 001000111111101100100000010110001010101000010110
i = 24: 0010001111111011001000000101100010101010
i = 32: 00100011111110110010000001011000
i = 40: 001000111111101100100000
i = 48: 0010001111111011
i = 56: 00100011
使用& 0xFF
,我选择该数字的最后8位。例如:
x >> 48: 001000111111101100100000
0xff: 11111111
(x >> 48) & 0xff: 000000000000000000100000
由于前导零不重要,您得到了所需的数字。
结果被转换为列表,并按正常和反向顺序打印(就像OP想要的那样)。
性能
我将此结果的计时与本线程中提出的其他解决方案进行了比较:
In: timeit list(reversed([(x >> i) & 0xFF for i in range(0,64,8)]))
100000 loops, best of 3: 13.9 µs per loop
In: timeit [(x >> (i * 8)) & 0xFF for i in range(7, -1, -1)]
100000 loops, best of 3: 11.1 µs per loop
In: timeit [(x >> i) & 0xFF for i in range(63,-1,-8)]
100000 loops, best of 3: 10.2 µs per loop
In: timeit reversed(struct.unpack('8B', struct.pack('Q', x)))
100000 loops, best of 3: 3.22 µs per loop
In: timeit reversed(struct.pack('Q', x))
100000 loops, best of 3: 2.07 µs per loop
结果:我的解决方案不是最快的!目前来看,直接使用struct
(如Mark Ransom所建议的)似乎是最快的代码片段。
divmod()
吗? - lenzbin = '{0:064b}'.format(source)
,我看到你是正确的。 - JHixsonn
是奇数且末尾没有1确实让我感到困惑。 - Padraic Cunningham