思路1:
def countOnes(self, num):
# write your code here
if num < -2147483648 or num > 2147483647:
return None
count = 0
while num:
if num%2 == 1:
count += 1
num = num/2
return count
运行结果当num= -1(11111111111111111111111111111111)时死循环?是不是因为不论是/2还是>>1,都属于算术右移操作,对于负数而言前面都补1而不是补0,所以死循环。
思路2:n&(n-1),n每减一次少一个1(把一个整数减去1后再和原来的整数做与操作,相当于对原整数的最右边的1做取反),一直重复到没有1
int countOnes(int num) {
// write your code here
int count =0;
while(num){
count ++;
num = num&(num-1);
}
return count;
}
C++版本的可以,但是用python写的就不能通过,-1不能输出,python中的负数表示有什么不同么?
def countOnes(num):
count = 0
while(num):
count += 1
num = num&(num-1)
return count
在stackoverflow上有人给出了答案,原来python中的数字是以任意长度存储的,因此当输入-1的时候,num会一直减——减小,
大概样子就是上面这样,当所以当然会一直死循环,那怎么改变呢?只要把num变成32位的就行,首先num = num&(0xffffffff),这样就可以了
def countOnes(num):
num = num & (0xffffffff)
count = 0
while(num):
count += 1
num = num&(num-1)
return count
准则1:整数n和n-1与,相当于n中最后一位1取反
准则2:异或操作,相同为0,不同为1. 输入两个整数m, n,需要改变m中的多少位才能变成n? 只改变m和n之间位不同的就可以。怎么监测位是否相同? 按位异或,不同为1,所以m异或n,计算结果中1的个数。