Python中左移运算符的混乱

2024-10-01 15:46:31 发布

您现在位置: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)

输出:

^{pr2}$

主要问题是,当它移动前导“1”时,它不是消失,而是又增加了一位。。。在

有什么解决办法吗?在


Tags: 代码returnbinisdefas二进制运算符
2条回答

您将使用&按位和对结果值进行掩码:

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

这里16是您想要的位宽度;您可以使用i.bit_length()将其限制为i所需的最小大小,但这意味着任何左移都将丢失位。在

掩码形成一系列宽度与原始值相同的1位;操作&将其中的任何位设置为0

^{pr2}$

一些旁注:

  • 你是左移,不是右移。在
  • 您似乎忘记在调试打印中添加d

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

    这里有一个单独的%,它与g相结合,使gives生成{}(浮点格式)。

  • 您可以使用:

    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位的掩码。在

^{pr2}$

相关问题 更多 >

    热门问题