当被问到计算二进制表示中1的数量的问题时,我想到的第一个答案是将数字向右移动并计算最不重要的位
但有一种说法,当数字为负数时,此方法会导致无限循环?
我用python快速尝试了
>>> a = -16
>>> a >> 1
-8
>>> a >> 1
-8
>>> -8 >> 1
-4
>>>
这是我所期望的,那么问题是什么,将负号移位导致符号位被转移到右边?
答案 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) )