为什么这两个循环返回不同的结果?

时间:2018-11-12 05:50:29

标签: python

我有一个循环,用于计算两个琴弦之间的总汉明距离。

对于输入:

nums = [4,14,2]

循环的一个版本:

n, ans = len(nums), 0    
for i in range(32):
        bit, cnt = 1<<i, 0

        for num in nums:
            cnt += num & bit 

        ans += cnt * (n-cnt)

return ans

给出错误的结果:-84

几乎相同的循环:

n, ans = len(nums), 0    
for i in range(32):
        bit, cnt = 1<<i, 0

        for num in nums:
            cnt += (num & bit) > 0  

        ans += cnt * (n-cnt)

return ans

给出正确答案6.我能弄清楚为什么?

第二个循环中的“> 0”有什么作用?我试图通过一个简单的测试来了解它的作用:

>>> i = -5 
>>> i += 1 
>>> i
-4
>>> i = -5 
>>> i += 1 > 0 
>>> i 
-4

和'> 0'似乎没有任何作用。为什么两个循环不同?

3 个答案:

答案 0 :(得分:1)

这是因为某些num&bit大于0,所以(即我的跑步中有一个8):

>>> a=8
>>> a>0
True
>>> int(a>0)
1

不是8 !!!

这就是为什么。

答案 1 :(得分:1)

num & bitnum & bit > 0不同;

num & bit是一个数字(int),而num & bit > 0是一个布尔值(bool);

在python中,True布尔值用作数字时是1

>>> i = -5 
>>> i += 2 
>>> i
-3
>>> i = -5 
>>> i += 2 > 0 
>>> i 
-4

根据经验,请勿使用10进行测试;用随机数进行测试(2也很糟糕,但此处易于阅读);

答案 2 :(得分:0)

在线

function reviveFromJSON(key, value) {
    let result = value;
    if (
        (typeof value === 'object' && value !== null)
            && (value.hasOwnProperty('_type'))) {
        switch (value._type) {
        case 'BigNumber':
            result = Object.assign(new BigNumber(0), value._data);
        }
    }
    return result;
}

state = JSON.parse(serialisedState, reviveFromJSON);
console.debug("state:", state);
// → { … dolor: BigNumber { s: 1, e: 2, c: [ 1, 0, 7, 5, 8 ] }, … }

您正在将cnt的值增加1,2,4,8的值。 在排队时

    cnt += num & bit

首先,您要验证语句,该语句返回0或1,然后使值无效0或1。 您可以通过在两个代码中打印cnt值来进行交叉检查。