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