二进制中1的个数

概念

左移运算符m<<n 表示把m 左移n位。左移n位的时候,最左边的n位将被直接的丢弃,同时在最右边补n个0 。

Paste_Image.png

左移运算符m>>n 表示把m右移n位。右移n位的时候,最右边的n位将被直接的丢弃,同时在最左边补n个符号位

Paste_Image.png

方法一:

int NumberOf1(int n){
   int count=0;
   while(n){
   if(n&1)
       count++;
    n>>1;  
   
  }
}

缺点:
由于负数的右移在最高位变为1,所以一直右移会导致整个负数全部变为1,所以,从而陷入死循环。
方法二

int NumberOf1(int n){
 int flag=1;
 int count=0;
while(flag){
     if(flag&n)
         count++;
     flag<<1;
}
return count;
}

缺点:不管有没有1都需要右移,32位整数需要移位3先次。

int NumberOf1(int n){
 int count=0;
 while(n){
     ++count;
     n=n&(n-1);
 }
return count;
}

最佳解法:把一个整数和整数减1之后的值做与,会把这个整数最右边的1变为0。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容