您的位置:首页 > 其它

32位整数的二进制表示中有多少个1

2016-03-17 16:24 330 查看
思路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的个数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: