Giải pháp
Giải pháp mà không cần chuyển đổi số thành một chuỗi:
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]
Giải thích
Ở đây tôi sử dụng comprehensions danh sách, thực hiện một vòng lặp trong từng bước của 8 trên i
. Vì vậy, i
có các giá trị 0, 8, 16, 24, 32, 40, 48, 56
. Mỗi lần, toán tử bithift >>
tạm thời thay đổi số x
xuống i
bit. Điều này tương đương với chia cho 256^i
.
Vì vậy, số lượng kết quả là:
i = 0: 0010001111111011001000000101100010101010000101101011111000000000
i = 8: 00100011111110110010000001011000101010100001011010111110
i = 16: 001000111111101100100000010110001010101000010110
i = 24: 0010001111111011001000000101100010101010
i = 32: 00100011111110110010000001011000
i = 40: 001000111111101100100000
i = 48: 0010001111111011
i = 56: 00100011
By usig & 0xFF
, tôi chọn 8 bit cuối cùng của con số này. Ví dụ:
x >> 48: 001000111111101100100000
0xff: 11111111
(x >> 48) & 0xff: 000000000000000000100000
Vì số 0 đứng đầu không quan trọng, bạn có số mong muốn.
Kết quả được chuyển đổi thành danh sách và được in theo thứ tự bình thường và được đảo ngược (như OP muốn nó).
Performance
Tôi đã so sánh thời gian của kết quả này với các giải pháp khác được đề xuất trong chủ đề này:
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
Kết quả: giải pháp của tôi là không nhanh nhất! Hiện tại, việc sử dụng trực tiếp struct
(như đề xuất bởi Mark Ransom) có vẻ là đoạn mã nhanh nhất.
Bạn đã thử 'divmod()' chưa? – lenz
Hãy đăng nhập, bạn đúng @PadraicCunningham. Tôi đã sử dụng một công cụ bẩn thỉu mà không hỗ trợ số lượng đủ lớn, và nó trucnated rằng phần cuối cùng với 0's. Bây giờ tôi đã chạy 'bin = '{0: 064b}'. Định dạng (nguồn)' tôi thấy rằng bạn là chính xác. – JHixson
Thực tế 'n' là lẻ và không có 1 ở cuối đã làm tôi bối rối –