Rozwiązanie
Rozwiązanie bez konwersji liczby na ciąg znaków:
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]
Wyjaśnienie
Tutaj użyłem listowych, tworząc pętlę w odstępach 8 nad i
. Tak więc i
przyjmuje wartości 0, 8, 16, 24, 32, 40, 48, 56
. Za każdym razem operator bitshift >>
tymczasowo przesuwa liczbę x
w dół o i
bitów. Jest to równoznaczne z dzieleniem przez 256^i
.
Tak uzyskana liczba jest:
i = 0: 0010001111111011001000000101100010101010000101101011111000000000
i = 8: 00100011111110110010000001011000101010100001011010111110
i = 16: 001000111111101100100000010110001010101000010110
i = 24: 0010001111111011001000000101100010101010
i = 32: 00100011111110110010000001011000
i = 40: 001000111111101100100000
i = 48: 0010001111111011
i = 56: 00100011
Przez usig & 0xFF
, wybiorę ostatnie 8 bitów tego numeru. Przykład:
x >> 48: 001000111111101100100000
0xff: 11111111
(x >> 48) & 0xff: 000000000000000000100000
Ponieważ początkowe zera nie mają znaczenia, masz żądaną liczbę.
Wynik zostanie przekonwertowany na listę i wydrukowany w normalnej i odwrotnej kolejności (tak, jak chciał tego OP).
Wydajność
Porównałem taktowanie tego wyniku do innych rozwiązań proponowanych w tym wątku:
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
Rezultat: moje rozwiązanie jest nie najszybszy! Obecnie użycie bezpośrednio przy pomocy struct
(zgodnie z propozycją Marka Ransoma) wydaje się być najszybszym fragmentem.
Czy próbowałeś 'divmod()'? – lenz
Dang it, masz rację @PadraicCunningham. Używałem szybkiego, brudnego narzędzia, które nie obsługiwało wystarczająco dużych liczb, a to zaowocowało ostatnią częścią z zerami. Teraz, gdy uruchomiłem 'bin = '{0: 064b}.' Format (source)' widzę, że masz rację. – JHixson
Fakt, że 'n' jest nieparzysty i nie było 1, na końcu nie myliłem się –