ソリューション
対処:
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
上の単位でループを作り、リストの内包を使用します。したがって、i
の値は0, 8, 16, 24, 32, 40, 48, 56
です。 ビットシフト演算子>>
は、毎回x
の数値をi
ビットだけ一時的にシフトします。これは、256^i
で割ることと同じです。
だから、結果の数値は以下のとおりです。usig & 0xFF
ことで
i = 0: 0010001111111011001000000101100010101010000101101011111000000000
i = 8: 00100011111110110010000001011000101010100001011010111110
i = 16: 001000111111101100100000010110001010101000010110
i = 24: 0010001111111011001000000101100010101010
i = 32: 00100011111110110010000001011000
i = 40: 001000111111101100100000
i = 48: 0010001111111011
i = 56: 00100011
、私はこの番号の最後の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()'を試しましたか? – lenz
ダング、あなたは正しい@パドレイクカニンガムです。私は十分に大きな数字をサポートしていない素早く汚れたツールを使用していました。最後の部分を0で表していました。これで 'bin = '{0:064b}'を実行しました。format(source)'あなたが正しいことが分かります。 – JHixson
'n'が奇数で、最後に1がないと私は混乱してしまいました –