2013-05-20 61 views
2

如何在python 3中迭代並評估給定特定二進制數的每個位的值?在二進制數中的位之間進行迭代

例如:

00010011 
-------------------- 
bit position | value 
-------------------- 
[0]   false (0) 
[1]   false (0) 
[2]   false (0) 
[3]   true (1) 
[4]   false (0) 
[5]   false (0) 
[6]   true (1) 
[7]   true (1) 
+2

是你的'二進制數'字符串嗎? –

+2

你到目前爲止嘗試過什麼?你的'二進制數'是一個字符串嗎(所以一串'0'和'1'字符)? –

+0

@MartijnPieters它是一個二進制數字,用bin() – Rafael

回答

5

這是更好地使用bitwise operators有位工作時:

number = 19 

num_bits = 8 
bits = [(number >> bit) & 1 for bit in range(num_bits - 1, -1, -1)] 

這給你8號的列表:[0, 0, 0, 1, 0, 0, 1, 1]。遍歷它並打印任何需要的東西:

for position, bit in enumerate(bits): 
    print '%d %5r (%d)' % (position, bool(bit), bit) 
+0

這是要走的路。數字的位操作也比分割和拼接字符串快得多。 – Reti43

3

Python中的字符串是序列號,以便您能剛剛超過他們環路像您可以用列表。添加enumerate(),你有你自己的索引,以及:

for i, digit in enumerate(binary_number_string): 
    print '[{}] {:>10} ({})'.format(i, digit == '1', digit) 

演示:

>>> binary_number_string = format(19, '08b') 
>>> binary_number_string 
'00010011' 
>>> for i, digit in enumerate(binary_number_string): 
...  print '[{}] {:>10} ({})'.format(i, digit == '1', digit) 
... 
[0]  False (0) 
[1]  False (0) 
[2]  False (0) 
[3]  True (1) 
[4]  False (0) 
[5]  False (0) 
[6]  True (1) 
[7]  True (1) 

我用format()代替bin()這裏,因爲你再不必在一開始就應對0b和你可以更容易地包括領導0

+0

+1。值得一提的是,雖然我很欣賞與輸出完全匹配,但我有點害怕OP會使用這個逐字記錄,並對「true」和「false」進行檢查 - 在通用代碼中清楚地使用實際'bool'值'真'和'假'。 –

+0

@Lattyware以及我不在那個n00b水平 – Rafael

+1

@Rafael你會驚訝於程序員的水平,我看到這樣的事情。我傾向於認爲最糟糕的。 –

0

此列表理解將爲您提供所需的數據。你是否也希望它在表格下格式化?

>>> [(i, b=='1', b) for i, b in enumerate('00010011')] 
[(0, False, '0'), (1, False, '0'), (2, False, '0'), (3, True, '1'), 
(4, False, '0'), (5, False, '0'), (6, True, '1'), (7, True, '1')] 
0

爲什麼要打擾字符串?此代碼是8位,但改變它應該是顯而易見的:

num = 19 
bits = [False for i in range(8)] 
for i in range(8): 
    bits[7-i] = True if num & 1 else False 
    num = num >> 1 

print(bits)