一.题目:
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成1001,有2位是1。因此如果输入9,该函数输出2。
二.分析:
1.可能引起死循环的解法:
判断输入的整数最右一位是否为1,然后循环右移,但是问题是如果输入的整数是一个负数,那么循环右移就会变成死循环。
2.常规解法:
将输入的整数不进行右移,而是将1进行循环左移进行判断。
3.能给面试官带来惊喜的解法:
思路为把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于把整数的二进制表示中的最右边一个1变成0。此方法整数有几个1就循环几次。
三.答案:
1.常规解法:
int numberOf1(int n) {
int count = 0;
int flag = 1;
while (flag) {
if (n & flag) {
count++;
}
flag = flag << 1;
}
return count;
}
2.能给面试官带来惊喜的解法:
int numberOf1(int n) {
int count = 0;
while (n) {
n = n & (n - 1);
count++;
}
return count;
}
四.相关题目:
1.用一条语句判断一个整数是不是2的整数次方。它的二进制表示中有且仅有一个1,把这个数减去1和自己位与,这个整数中唯一的1就会变成0。
2.输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。我们可以分为两步:第一步求这两个数的异或,第二步统计异或结果中1的个数。