计算其二进制表示中的1的数量 - 右移不起作用?

时间:2013-03-06 13:51:32

标签: python

当被问到计算二进制表示中1的数量的问题时,我想到的第一个答案是将数字向右移动并计算最不重要的位

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

我用python快速尝试了

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

http://docs.python.org/2/reference/expressions.html#shifting-operations:向右移动等同于除法。然后检查http://docs.python.org/2/reference/expressions.html#binary-arithmetic-operations:整数除法对结果隐含地应用floor,因此-1 / 2 = -1 floor(-0.5) = -1以及{{1}},无论您从哪个开始,您最终都会达到-1 。因此,你最终会得到一个无限循环。

答案 2 :(得分:1)

如果我们谈论python的无限精度整数,那么任何负数都有1个无限数!所以无论符号填充(你也会在C中得到),除了固定的比特长度之外,对负数进行计数是非感性的。

对于32位或64位int,只需多次移动并停止。

以下是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) )