zoukankan      html  css  js  c++  java
  • 二进制中为1 的数字个数

    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

    1.右移肯定是不行 因为若是有符号数中的复数,那么则进入死循环

    2.左移flag 让n保持不动;

    可能有疑惑:while(flag)不是一个死循环了吗??

    毕竟flag左移一直是大于0;

     int  NumberOf1(int n)
       {
         unsigned int rc=1;
         int count=0;
          //int num=0;
           while(rc)
           {
            if(n&rc)
             count++; 
             rc=rc<<1;
             //num++;
             //cout<<rc<<"num"<<num<<endl;
           }
           return count;
       }
    

     

     看调试结果: 证明了循环的次数等于 整数二进制的位数   比如int 就循环32次 (注意:1左移32次后   就越界int了等于0!! 以前都不知道)

    2num1
    
    4num2
    
    8num3
    
    16num4
    
    32num5
    
    64num6
    
    128num7
    
    256num8
    
    512num9
    
    1024num10
    
    2048num11
    
    4096num12
    
    8192num13
    
    16384num14
    
    32768num15
    
    65536num16
    
    131072num17
    
    262144num18
    
    524288num19
    
    1048576num20
    
    2097152num21
    
    4194304num22
    
    8388608num23
    
    16777216num24
    
    33554432num25
    
    67108864num26
    
    134217728num27
    
    268435456num28
    
    536870912num29
    
    1073741824num30
    
    2147483648num31
    
    0num32

    2.改进后:

       int  NumberOf1(int n) 
         {
       
            int count=0;
             while(n)
             {
             count++;
             n=n&(n-1);
             }
             return count;
         }
  • 相关阅读:
    swift NSComparator
    Java mac 上编写Java代码
    四舍五入、上取整、下取整
    数组排序
    删除xcode 里的多余证书
    启动画面 设置
    CGFloat Float 互转
    navigationController pop的几种方法
    iOS 获取键盘相关信息
    eclipse代码格式化
  • 原文地址:https://www.cnblogs.com/cgy1012/p/11376367.html
Copyright © 2011-2022 走看看