簡體   English   中英

python中左移運算符的混亂

[英]confusion in left shift operator in python

我試圖在整數的16位二進制表示上使用左移運算符

編寫的代碼如下:

def showbits(x):
    return bin(x)[2:].zfill(16)
i=5225
print "Decimal %d is same as binary" % (i)
print showbits(i)
for j in range(0,5,1):
    k=i<<j
    print "%d right shift % gives" % (i,j)
    print showbits(k)

輸出:

Decimal 5225 is same as binary
0001010001101001
5225 right shift  0ives
0001010001101001
5225 right shift  1ives
0010100011010010
5225 right shift  2ives
0101000110100100
5225 right shift  3ives
1010001101001000
5225 right shift  4ives
10100011010010000

主要的問題是,當它移動前導'1'時,它並沒有消失,而是在增加一點......

任何解決方案?

您可以使用&按位AND來屏蔽結果值:

mask = 2 ** 16 - 1
k = (i << j) & mask

16是您所需的位寬; 您可以使用i.bit_length()將其限制為i的最小所需大小,但這意味着任何左移都會丟棄位。

掩碼形成一系列1位,其寬度與原始值相同; &操作將這些之外的任何位設置為0:

>>> 0b1010 & 0b111
2
>>> format(0b1010 & 0b111, '04b')
'0010'

一些旁注:

  • 左移 ,而不是右移。
  • 您似乎忘記了調試打印中的d

     print "%d left shift %d gives" % (i,j) 

    那里有一個孤獨的% ,它與g相結合, gives %g (浮點格式)。

  • 您可以使用:

     def showbits(x): return format(x, '016b') 

    將整數格式化為0填充的16個字符寬的二進制表示形式( 不帶 0b前綴)。

因為Python有一些魔力可以防止這種情況發生,即被稱為溢出。 它通過調整類型來實現:

>>> i = 5225
>>> type(i)
<type 'int'>
>>> j = i << 16; type(j); bin(j)
<type 'int'>
'0b10100011010010000000000000000'
>>> j = i << 32; type(j); bin(j)
<type 'int'>
'0b101000110100100000000000000000000000000000000'
>>> j = i << 64; type(j); bin(j)
<type 'long'>
'0b10100011010010000000000000000000000000000000000000000000000000000000000000000'
>>> j = i << 128; type(j); bin(j)
<type 'long'>
'0b101000110100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'

如果你想限制你想要使用的位,就像Martijn建議並使用16位掩碼一樣。

>>> j = 0xffff & (i << 12); type(j); bin(j)[2:].zfill(16)
<type 'int'>
'1001000000000000'
>>> j = 0xffff & (i << 13); type(j); bin(j)[2:].zfill(16)
<type 'int'>
'0010000000000000'
>>> j = 0xffff & (i << 14); type(j); bin(j)[2:].zfill(16)
<type 'int'>
'0100000000000000'
>>> j = 0xffff & (i << 15); type(j); bin(j)[2:].zfill(16)
<type 'int'>
'1000000000000000'
>>> j = 0xffff & (i << 16); type(j); bin(j)[2:].zfill(16)
<type 'int'>
'0000000000000000'

暫無
暫無

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

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