错误方法:
数字右移,这里会涉及到移位的规则。
移位规则:
左移运算符m<<表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在右边补上n个0;
右移比左移稍微复杂一些,如果数字是一个无符号值或正数,右移时最左边补0;
如果数字是一个负数,则最左边补1。
//以下是有缺陷的写法
//如果给一个负数,则右移右边会一直补1,会导致死循环。
int CountOf1(int n)
{
int count = 0;
while(n){
if(n & 1)
count++;
n=n>>1;
}
return count;
}
方法一:不移数字,只移比较的1
//如果数字是32位,则最多只用比较32次
int CountOf1(int n)
{
int count = 0;
unsigned int flag = 1;
while(flag){
if(n & flag)
count++;
flag = flag<<1;
}
return count;
}
方法二:与运算
//(有几个1就会循环几次)
int CountOf1(int num)
{
int count = 0;
while(num)
{
++count;
num = num & (num-1);
}
return count;
}