我已成功运行C ++中的代码,代码如下:
int countOnes(int num) {
int count =0;
while (num) {
count ++;
num = num & (num-1);
}
return count;
}
但它在Python版本中不起作用:
def countOnes(num):
count = 0
while(num):
count += 1
num = num&(num-1)
return count
当num = -1(0Xffffffff)时似乎被阻止了,为什么它在C ++中工作,而在python中却没有?
答案 0 :(得分:4)
这个函数在两种语言中的工作方式不同的原因是它们具有不同的基本数字类型。在C ++中,int
实际上通常是二进制补码表示中的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
让我们看看我们得到的不同输入:
>>> countOnes(1)
0
1
>>> countOnes(7)
6
4
0
3
然而,对于-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
使用调试输出时,countOnes(-1)
的输出现在为:
>>> 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
根据需要:)
答案 1 :(得分:0)
Python没有&#34; 32位整数&#34;。它的整数是任意的(读取:无限)长度。这意味着-1是不是 0xffffffff,而是一个无限长的1s二进制序列。
答案 2 :(得分:0)
您可以创建32位表示限制
def countOnes(num):
num = num % (1 << 32)
count = 0
while(num):
count += 1
num = num&(num-1)
return count