面试题15:二进制中1的个数
题目:请实现一个函数,输入一个整数,输出改数的二进制表示中1的个数
- 常规解法
思路:通过与运算来判断某一个是否为1。该数先和1相与,如果结果为1,则第一位为1,然后1左移一位与该数相与,判断第二位是否为1 ,以此类推,即可判断该数的二进制中有多少个1。
代码:
int getNumOfOneInBinary1(int num)
{
int count = 0;
unsigned int flag = 1;
while (flag)
{
if (num & flag)
{
count++;
}
flag = flag << 1;
}
return count;
}
由于无符号整型有32位,其中的while循环要循环32次才能结束。所以可以考虑另一种解法。
- 进阶版
思路:某个整数减一与该数相与,可以式该数最左边的位数变0。
代码:
int getNumOfOneInBinary2(int num)
{
int count = 0;
while (num)
{
count++;
num = (num - 1) & num;
}
return count;
}
相关题目:
- 用一句话判断一个整数是不是2的整数幂
思路:如果一个数是2的整数幂,那么该数的二进制中只有1个1。可以将该数减一与该数相与,如果为零,则该数就是2的整数幂。 - 输入两个整数m和n,需要改变m的二进制数多少位才能得到n?
思路:先统计这两个数二进制表示法中有多少位不同,可以通过异或计算得到;然后计算异或结果的二进制中有多少个1得到。