Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多少';1';在用python编程的32位整数中 我已经成功地在C++中运行了代码,代码如下: int countOnes(int num) { int count =0; while (num) { count ++; num = num & (num-1); } return count; }_Python_C++_Bit Manipulation - Fatal编程技术网

多少';1';在用python编程的32位整数中 我已经成功地在C++中运行了代码,代码如下: int countOnes(int num) { int count =0; while (num) { count ++; num = num & (num-1); } return count; }

多少';1';在用python编程的32位整数中 我已经成功地在C++中运行了代码,代码如下: int countOnes(int num) { int count =0; while (num) { count ++; num = num & (num-1); } return count; },python,c++,bit-manipulation,Python,C++,Bit Manipulation,但它在Python版本中不起作用: def countOnes(num): count = 0 while(num): count += 1 num = num&(num-1) return count 当num=-1(0xfffffffff)时,它似乎被阻塞了,为什么它在C++中工作,而不是在Python中? < P> Python没有“32位整数”。它的整数是任意(读:无限)长度。这意味着-1不是0xFFFFFF,而是一个无限

但它在Python版本中不起作用:

def countOnes(num):
    count = 0
    while(num):
        count += 1
        num = num&(num-1)
    return count

当num=-1(0xfffffffff)时,它似乎被阻塞了,为什么它在C++中工作,而不是在Python中?

< P> Python没有“32位整数”。它的整数是任意(读:无限)长度。这意味着-1不是0xFFFFFF,而是一个无限长的1的二进制序列。

此函数在两种语言中工作方式不同的原因是它们具有不同的基本数类型。在C++中, INT/COD>通常是二进制补码表示中的32位整数,尽管语言标准允许其他表示。然而,在Python中,标准数字类型具有任意精度

循环的延续标准是
num
为非零。如果没有终止,让我们添加一些调试,看看会发生什么:

def countOnes(num):
    count = 0
    while(num):
        count += 1
        num = num&(num-1)
        print(num) # <-- inspect what happens to num
    return count
然而,对于
-1
,事情很快就会失控:

>>> countOnes(-1)
-2
-4
-8
-16
-32
-64
-128
-256
-512
-1024
-2048
-4096
...
num
不断减少。由于数字类型具有任意大小,因此该数字只会继续以负数增长

要模拟C整数的固定精度,可以将
num
限制为32位:

def countOnes(num):
    num = num & 0xffffffff # <-- Limit num to 32 bits
    count = 0
    while(num):
        count += 1
        num = num&(num-1)
    return count

根据需要:)

您可以创建32位表示限制

def countOnes(num):
    num = num % (1 << 32)
    count = 0
    while(num):
        count += 1
        num = num&(num-1)
    return count
def countone(num):

num=num%(1“无限长的1的二进制序列”…好吧…从概念上讲,这样想是有意义的,在这个计数器中也是如此。内部表示不是无限的;)不需要
+(1)你真的很清楚地讨论了这个问题。我认为它在python中是任意长度的,但没有意识到它会越来越小。谢谢你!@MagnusHoff@liuxy:如果你的问题解决了,你应该接受解决它的答案。你可以通过单击计票下面的灰色复选标记来完成。这会给出一个对帮助您的奖励,并将问题从未回答列表中删除。
>>> countOnes(-1)                         
4294967294
4294967292
4294967288
4294967280
4294967264
4294967232
4294967168
4294967040
4294966784
4294966272
4294965248
4294963200
4294959104
4294950912
4294934528
4294901760
4294836224
4294705152
4294443008
4293918720
4292870144
4290772992
4286578688
4278190080
4261412864
4227858432
4160749568
4026531840
3758096384
3221225472
2147483648
0
32
def countOnes(num):
    num = num % (1 << 32)
    count = 0
    while(num):
        count += 1
        num = num&(num-1)
    return count