[英]Is it possible to do bit reversal for a 16 bit number only using shift left, xor, and bitwise operations on python
[英]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.