输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
方法一:每次左移1位,与1做&操作,看是1还是0,终止条件是此数为0,问题是负数怎么办,左移高位就会补零,造成死循环。
方法二:每次与1做&操作,看是不是1移位后的那个数,然后右移1,终止条件是1被移为了0.这个对负数也成立。
方法三:数减去1,就会从最低位开始的第一个1变0,其后的所有0变1,将 num-1 & num 如果不为0 ,那么证明还有1,如此直至这个数
变为0. 问题是对负数不成立。
int NumberOf1_Solution1(int i)
{
int count = 0;
while(i)
{
if(i & 1)
count ++;
i = i >> 1;
}
return count;
}
int NumberOf1_Solution2(int i)
{
int count = 0;
unsigned int flag = 1;
while(flag)
{
if(i & flag)
count ++;
flag = flag << 1;
}
return count;
}
int NumberOf1_Solution3(int i)
{
int count = 0;
while (i)
{
++ count;
i = (i - 1) & i;
}
return count;
}
扩展:如何用一个语句判断一个整数是不是二的整数次幂?
思路:先取绝对值,再来看是否最低位不是1,其他位仅仅含有一个1
转贴自:http://zhedahht.blog.163.com/blog/static/25411174200732102055385/