10、二进制1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解法一:不好!!!负数容易死循环(思想:先判断整数二进制表示中最右边1位是不是为1,然后右移一位)
//解法一
int Numberof1(int n)
{
int count = 0;
while (n)
{
if (n & 1)
count++;
n=n >> 1;
}
return count;
}
解法二:常规解法,优于解法一(思想:先把整数与1做运算,然后将1左移)
循环的次数=二进制整数的位数
//解法二
int Numberof1(int n)
{
int count = 0;
unsigned int flag = 1;
while (flag)
{
if (n & flag)
count++;
flag=flag << 1;
}
return count;
}
解法三:最优解法,有几个1就循环几次,(思想:把一个整数减去1,再和原数做与运算,会把一个整数最右边一个1变为0)
把一个整数减去1,再和原数做与运算,会把一个整数最右边一个1变为0:很多问题都可以用这个思路解决
/解法三
int Numberof1(int n)
{
int count = 0;
while (n)
{
++count;
n = (n - 1)&n;
}
return count;
}
相关题目:
1、判断一个数是不是2的整数次方。一个数要是2的整数次方,他的二进制表示中有且仅有一个1.(思路:把这个数减1,再和它自身做与运算,为0的数)
2、输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。(思路:先求这两个数的异或,再统计异或结果中1的个数)