面试题15:二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:常规思路
常规思路就是不断从右向左判断数字的那个位置是不是1,通过位与运算。即可判断。
注意要flag左移,而不是n右移,因为n有可能是负数,而负数右移最高位填充的是符号位。
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
int flag = 1;
while(flag){
if(n & flag)
count++;
flag = flag << 1;
}
return count;
}
};
思路2:
把一个数减去1再与原数相与,会把该数最右边的1变成0,那么一个数可以做多少次这个运算,就代表有多少个1.
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
while(n){
++count;
n = n & (n-1);
}
return count;
}
};
扩展
1.用一条语句判断一个整数是不是2的整数次方?
一个整数如果是2的整数次方,那么必然它的二进制中有且只有一位是1,其余都是0,所以,将这个数减1再和它相与,结果必然为0,若不为零,则不是2的整数次方。
2.两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。
分为两步,第一步求这两个数的异或,然后统计异或结果中1的个数。