我正在尝试对整数的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'时,它不是消失,而是增加一位。。。
有什么解决办法吗?

最佳答案

您将使用&按位屏蔽结果值,并:

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')

将整数格式化为不带0b前缀的0填充16个字符宽的二进制表示。

关于python - python中左移运算符的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21405341/

10-11 04:11