zoukankan      html  css  js  c++  java
  • 【转】判断一个整数转换成二进制后1的个数

    判断一个整数转换成二进制后1的个数,大致有三种方法,分别是左移位、右移位和与运算

    第一种方法:右移位

            右移位的基本思路是,先将整数转换成正整数,再将该数与1进行与运算。若不将整数做取绝对值处理,当输入的数是负数时,每向右移动一位,高位会自动补1,就会导致死循环

     
    1. int ChargeOnesCountInNum1(int iNum)  
    2. {  
    3.     int iCount=0;  
    4.     iNum = abs(iNum);//注意添加上了绝对值  
    5.     while(iNum){  
    6.         if (iNum & 1){  
    7.             ++iCount;  
    8.         }  
    9.         iNum = iNum >> 1;  
    10.     }  
    11.   
    12.     return iCount;  
    13. }  

    第二种方法:左移位

            左移位的基本思路和右移位相同。

     
    1. int ChargeOnesCountInNum2(int iNum)  
    2. {  
    3.     int iCount=0;  
    4.     unsigned int iFlag = 1;  
    5.     iNum = abs(iNum);//注意添加上了绝对值  
    6. </span>   while(iFlag){  
    7.         if (iNum & iFlag){  
    8.             ++iCount;  
    9.         }  
    10.         iFlag = iFlag << 1;  
    11.     }  
    12.       
    13.     return iCount;  
    14. }  

    第三种方法:与运算

            将一个整数减去1之后,其对应的二进制中最右边的一个1会变为0,若其后存在0,则其之后的所有0都会变为1。基于此,设一个整数为n,则 n & (n-1)之后,会消掉n对应的二进制的最右边的1。因此,将一个数中所有1消掉所用的次数,即为该整数对应的二进制中1的个数。

     
    1. int ChargeOnesCountInNum3(int iNum)  
    2. {  
    3.     int iCount=0;  
    4.     iNum = abs(iNum);//注意添加上了绝对值  
    5.     while(iNum){  
    6.         ++iCount;  
    7.         iNum = iNum & (iNum-1);  
    8.     }  
    9.       
    10.     return iCount;  
    11. }  

            左移位或者是右移位,while循环执行的次数取决于计算机的位数,32位的计算机就执行32次,而64位则要执行64次。而与运算的方法执行的次数,只与该数中1的个数有关。因此与运算方法,是三种方法中最好的一个。

    相关的变形问题

    • 用一条语句判断一个整数是不是2的整数次方。参考答案:if ( !(iN & (iN-1)) ){}
    • 输入两个整数m和n,计算m和n对应的二进制中有多少个不同的位。参考思路:先对m和n进行异或,然后计算异或后的二进制结果中1的个数。
  • 相关阅读:
    解决首次在eclipse中使用maven构建hadoop等项目时报Missing artifact sun.jdk:tools:jar:1.5.0的问题
    分享eclipse自动生成java注释方法
    Android篇Styles和Themes常见用法可能疑点小结
    常用文件的MIME类型
    C#中如何将字符串转换byte[],同时如何将byte[]换成字符串
    TransactSQL语句进行导入导出[转]
    随机索引生成
    C#使用ZLIB对字符串进行压缩
    C#对XML文件的读操作
    SQL语句删除数据库重复记录的方法
  • 原文地址:https://www.cnblogs.com/yihujiu/p/6632320.html
Copyright © 2011-2022 走看看