Có hai cách có thể để trả lại bit thứ i của một byte. "Bit đầu tiên" có thể tham chiếu đến bit thứ tự cao hoặc nó có thể tham chiếu đến bit thứ tự thấp hơn.
Đây là hàm nhận chuỗi và chỉ mục làm tham số và trả về giá trị của bit tại vị trí đó. Như được viết, nó xử lý bit thứ tự thấp như bit đầu tiên. Nếu bạn muốn bit thứ tự cao đầu tiên, chỉ cần bỏ ghi chú dòng được chỉ định.
def bit_from_string(string, index):
i, j = divmod(index, 8)
# Uncomment this if you want the high-order bit first
# j = 8 - j
if ord(string[i]) & (1 << j):
return 1
else:
return 0
Việc lập chỉ mục bắt đầu từ 0, bạn có thể điều chỉnh chỉ mục trong hàm trước khi gọi divmod
.
Ví dụ sử dụng:
>>> for i in range(8):
>>> print i, bit_from_string('\x04', i)
0 0
1 0
2 1
3 0
4 0
5 0
6 0
7 0
Bây giờ, đối với cách thức hoạt động:
Một chuỗi gồm byte 8-bit, vì vậy đầu tiên chúng tôi sử dụng divmod() để phá vỡ các chỉ số thành đến các bộ phận:
i
: chỉ số của byte đúng trong chuỗi
j
: chỉ số của các bit đúng w ithin rằng byte
Chúng tôi sử dụng hàm ord()
để chuyển đổi ký tự tại string[i]
thành một số nguyên. Sau đó, (1 << j)
tính giá trị của bit thứ j bằng cách dịch chuyển trái 1 theo j
. Cuối cùng, chúng tôi sử dụng bitwise-và để kiểm tra nếu bit đó được thiết lập. Nếu trả lại 1, nếu không trả lại 0.
Nguồn
2010-04-05 03:52:45
Thử nghiệm này (btw byte là ít endian) và ord ('\ x04') trả về 4 sẽ trả về chuỗi bit '0000100' sử dụng mã của bạn tôi nhận được '000100000' – David
oops i có nghĩa là tôi nhận được '00100000' với mã của bạn – David
Nó cung cấp cho bit thấp đầu tiên (đó là tự nhiên, vì nó cũng cung cấp cho byte thấp đầu tiên). Nhưng nếu bạn muốn thứ tự khác, bạn có thể thay đổi 'xrange (8)' thành 'đảo ngược (xrange (8))'. –