Python 计算二进制表示形式中的1数——右移don';不行?

Python 计算二进制表示形式中的1数——右移don';不行?,python,Python,当被问及在二进制表示法中计算1的数量时,我想到的第一个答案是将数字右移,然后计算最不重要的位 但是有一种说法,当数字为负数时,这种方法会导致无限循环吗 我很快尝试了python >>> a = -16 >>> a >> 1 -8 >>> a >> 1 -8 >>> -8 >> 1 -4 >>> 这就是我所期望的,那么问题是什么,将负数移位会导致符号位移到右边?这是真的,

当被问及在二进制表示法中计算1的数量时,我想到的第一个答案是将数字右移,然后计算最不重要的位

但是有一种说法,当数字为负数时,这种方法会导致无限循环吗

我很快尝试了python

>>> a = -16
>>> a >> 1
-8
>>> a >> 1
-8
>>> -8 >> 1
-4
>>>

这就是我所期望的,那么问题是什么,将负数移位会导致符号位移到右边?

这是真的,你会得到一个无限循环,因为一旦你到达
-1
你就无法离开那里:

>>> a = -1
>>> a >> 1
-1

这听起来像是家庭作业,所以我不会给你一个完整的答案,但看看内置的
mod
函数。

没错,你会得到一个无限循环,因为一旦你到达
-1
,你就无法离开那里:

>>> a = -1
>>> a >> 1
-1

这听起来像是家庭作业,所以我不会给你一个完整的答案,但请看一下内置的
mod
函数。

请参见:向右移动等同于除法。然后检查:整数分割隐式地应用于结果上的
floor
,因此
-1/2=-1
因为
floor(-0.5)=-1
,不管您从哪个数字开始,最终都会达到-1。因此,您将得到一个无限循环。

请参见:向右移动等同于除以。然后检查:整数分割隐式地应用于结果上的
floor
,因此
-1/2=-1
因为
floor(-0.5)=-1
,不管您从哪个数字开始,最终都会达到-1。因此,您将得到一个无限循环。

如果我们讨论的是python的无限精度整数,那么任何负数都有无限个1!因此,不管符号填充如何(在C中也会得到符号填充),除了固定的位长度外,以负数计算位是没有意义的

对于32位或64位整数,只需多次移位并停止

以下是32位整数-4中的位

>>> n = -4
>>> for bit in reversed([ (n>>shift)&1 for shift in range(32) ]):
...    print bit,
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
总而言之,这只是

sum( (n>>shift)&1 for shift in range(32) )

如果我们谈论的是python的无限精度整数,那么任何负数都有无限个1!因此,不管符号填充如何(在C中也会得到符号填充),除了固定的位长度外,以负数计算位是没有意义的

对于32位或64位整数,只需多次移位并停止

以下是32位整数-4中的位

>>> n = -4
>>> for bit in reversed([ (n>>shift)&1 for shift in range(32) ]):
...    print bit,
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
总而言之,这只是

sum( (n>>shift)&1 for shift in range(32) )

你的号码有多宽?如果我们说的是无限精度整数,那么任何负数都有无限个1!如果我们谈论32位或64位的int型,只需多次移动,然后停止。“亚历克西斯,是的,我在谈论C++中的32位,看起来我对Python实现感到困惑。你的数字有多宽?”如果我们说的是无限精度整数,那么任何负数都有无限个1!如果我们谈论32位或64位的int型,只需多次移动并停止。@亚历克西斯,是的,我在谈论C++中的32位,似乎我被Python实现混淆了。