题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解法1:
思路:1与该数相与,如果不为0,说明最末位上的数字为1。1左移一位,与该数相与,如果不为0,说明倒数第二位上的数字为1。将1继续左移与该数比较,统计1的个数。注意:不能让该数往右移的方式来与1比较,因为负数往右移,高位会补1,就会陷入死循环。
代码:
public class Solution {
public int NumberOf1(int n) {
int count=0;
int num=1;
for(int i=0;i<=31;i++){
if((n&num)!=0){
count++;
}
num<<=1;
}
return count;
}
}
解法2:
思路:非常巧妙,n=(n-1)&n,该数与该数-1相与。该数减一会使该数最低的1所在位变为0,最低为之后的位全部变为1,而该数本身最低的1所在位之后的位全为0,两者相与会使最低的1所在位和它之后的位全部变为0,这样不断相与,有多少个1就能与多少次,跳出条件为n==0。
代码:
public class Solution {
public int NumberOf1(int n) {
int count=0;
while(n!=0){
n=n&(n-1);
count++;
}
return count;
}
}