簡體   English   中英

對如何在python shell中對16位二進制數執行按位運算感到困惑

[英]Confused about how to perform bitwise operations on 16bit binary number in python shell

我正在學習python中的按位運算符,因此我嘗試在shell中進行一些實驗。 我嘗試使用8位數字進行位操作,這似乎正常工作,但是如果我嘗試使用16位數字,則會發生這種情況:

>>> b = 0010000000000000
>>> b
549755813888

如果我嘗試更大的數字,那么輸出一開始看起來很正常:

a = 1011110110011001
>>> a
1011110110011001

>>> b = 1100001110000101
>>> b
1100001110000101

但是,當我應用按位運算符(例如OR |,我又得到了一個十進制輸出。

>>> a | b
1125874135965693

我覺得這很令人困惑。 二進制運算符的結果不應該是二進制嗎? 如果是這樣,轉換在哪里發生? 最后,為什么只有在我嘗試使用16位二進制文​​件時才會發生這種情況?

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

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

您沒有告訴Python您要輸入二進制數; 像C一樣,Python會將0010000000000000解釋為八進制(8 ** 13),並將1011110110011001解釋為十進制。 請改用0b前綴和bin函數:

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

您的8位值(Python也不知道,int通常為32位或64位,但是最新版本將無縫過渡到可以擴展到任意寬度的long值)的值的解釋方式完全相同。 無論前面有多少個零,無論在哪個底數中,其他數字都是偶數,1都是1。 嘗試100 | 1000 100 | 1000 (產生1004)用於失敗的低位示例(實際值為0b1111101000和0b1100100)。

盡管您僅使用1 s和0 s,但這不會使您輸入的數字成為二進制數:它們是十進制(如果從0開始則為八進制)。

如果要使用二進制數,請給它們加上0b前綴(至少假定Python 2.6)。 看到這個問題

如果您想打印出結果,您可能還會發現bin()很有用。


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

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

您仍然對0b表示法感到困惑。 10000000不是8位數字,而是十進制數字,您至少需要24位才能表示它( bin(10000000)0b100110001001011010000000 )。

原因10000000 | 00000001 10000000 | 00000001似乎在“工作”,就好像它是一個二進制表示形式一樣,即00000001 (它是一個八進制表示形式)也恰好是十進制的1。 這真的是0b100110001001011010000000 | 0b000000000000000000000001 0b100110001001011010000000 | 0b000000000000000000000001

例如, 00000010是十進制的8 ,因此10000000 | 00000010 10000000 | 00000010將是10000008 如果您的數字以0開頭,則為八進制表示;否則為0 如果以0x ,則為十六進制; 如果以0b開頭,則為二進制; 否則為十進制。

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

您正在使用的操作是按位的,但是您提供的數字中的1 s並不代表單個位。

您可能希望看到的是:

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

在這里,您提供的數字是二進制格式( 0b... ),該操作是按位的(其他表示法也是按位的,只是被激活的位不是您認為的那些)使用bin(...)將其轉換為二進制表示形式。

要在Python中編寫二進制文字,您需要在文字前加上0b前綴。 a = 0b1011110110011001 有關更多詳細信息,請參見此問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM