2015-05-04 52 views
0

我正在學習python中的按位運算符,因此我試圖在shell中做一些實驗。我想這樣做有8位數字位操作,並且似乎正常工作,但如果我嘗試使用16位數字出現這種情況:如何在python shell中對16位二進制數執行按位操作感到困惑

a = 1011110110011001 
>>> a 
1011110110011001 

>>> b = 1100001110000101 
>>> b 
1100001110000101 

>>> b = 0010000000000000 
>>> b 
549755813888 

如果我嘗試更大數量的輸出起初似乎正常

但是,當我應用一個按位運算符,例如OR |,然後我再次得到一個十進制輸出。

>>> a | b 
1125874135965693 

我覺得這很混亂。二元運算符的結果不是二進制文件嗎?如果是的話,轉換髮生在哪裏?最後,爲什麼只有在使用16位二進制文​​件進行嘗試時纔會發生這種情況?

編輯:我得到以下嘗試8位時:

>>> c = 00000001 
>>> d = 10000000 
>>> c | d 
10000001 

回答

4

你還沒告訴Python的,你進入二進制數;像C,Python會將0010000000000000解釋爲八進制(8 ** 13),並將1011110110011001解釋爲十進制。使用前綴0b和回收站功能來代替:

>>> a = 0b1011110110011001 
>>> b = 0b1100001110000101 
>>> bin(a|b) 
'0b1111111110011101' 

你的8位(Python不知道,要麼,int是典型的32或64位,但最近的版本將無縫地過渡到長,這可以去任何寬度)值被解釋爲完全相同的方式。只要1就是1,不管前面有多少個零位,在任何基地裏,另一個數字都是偶數。嘗試使用100 | 1000(產生1004),這是一個失敗的實例(實際值爲0b1111101000和0b1100100)。

+0

這很有道理,但解釋器會自動將8位識別爲不帶'0b'前綴的二進制文件嗎? – Sifu

+0

您可能想發佈一個您認爲正在工作的8位值的示例。 – chepner

+0

我會更新問題以包含示例 – Sifu

0

要在Python中編寫二進制文字,您需要在文字前加0b。如a = 0b1011110110011001。有關更多詳細信息,請參閱this question

1

雖然您只使用1 s和0 s,但這並不會使您輸入的數字成爲二進制數字:它們是十進制數(如果以0開頭,則爲八進制數)。

如果您想使用二進制數字,請以0b(假設Python至少爲2.6)爲前綴。見this question

如果您想打印出結果,您也許會發現bin()有用。


編輯:我得到以下嘗試8位時:

>>> c = 00000001 
>>> d = 10000000 
>>> c | d 
10000001 

你還在困惑的0b符號。 10000000不是一個8位數字,它是一個十進制數字,並且您至少需要24位來表示它(bin(10000000)0b100110001001011010000000)。

原因10000000 | 00000001似乎「工作」就好像它是一個二進制表示法,00000001(這是一個八進制表示)也恰好是十進制的1。這確實是0b100110001001011010000000 | 0b000000000000000000000001

例如,000000108的十進制數,所以10000000 | 00000010應該是10000008。如果您的號碼以0開頭,則爲八進制表示;如果它以0x開頭,則爲十六進制;如果它以0b開頭,它是二進制的;否則,它是小數。

您的特定使用案例(10000000 | 1)有一點運氣。嘗試10000000 | 1000,你的假設不再有效:那是10000360

您使用的操作是按位進行的,但您提供的數字中的1不代表單個位。

什麼你可能會希望看到的是:

>>> bin(0b10000000 | 0b00001000) 
'0b10001000' 

在這裏,我們提供的數字是二進制格式(0b...),操作是按位(上述操作是按位也爲其他符號,只是激活的位不是您認爲的那些),然後您將其重新轉換爲bin(...)的二進制表示。