• 位运算之二进制中1的个数


      1 /**
      2  参考的剑指offer
      3  */
      4 #include <stdio.h>
      5 
      6 int numberOf1(int n);
      7 int betterNumberOf1(int n);
      8 _Bool judgeIs2Cifang(int n);
      9 int numberOfTransform(int m, int n);
     10 
     11 int main(int argc, const char * argv[]) {
     12     
     13     int n;
     14     int countOf1;
     15     int betterCountOf1;
     16     _Bool is2Cifang;
     17     int transformCount;
     18     int transM,transN;
     19     
     20     while (1) {
     21         printf("请输入一个整数:	");
     22         scanf("%d",&n);
     23         countOf1 = numberOf1(n);
     24         betterCountOf1 = betterNumberOf1(n);
     25         is2Cifang = judgeIs2Cifang(n) ? 1 : 0;
     26         
     27         
     28 
     29     
     30         printf("%d	转换为二进制之后含有1的个数为	%d
    
    ",n,countOf1);
     31         printf("%d	转换为二进制之后含有1的个数为	%d
    
    ",n,betterCountOf1);
     32         if(is2Cifang){
     33             printf("%d	是2的整数次方
    
    ",n);
     34         }else{
     35             printf("%d	不是2的整数次方	
    
    ",n);
     36         }
     37         
     38         
     39         printf("输入待相互转化的两个数:	");
     40         scanf("%d %d",&transM,&transN);
     41         transformCount = numberOfTransform(transM, transN);
     42         printf("%d和%d转化需要的次数是%d
    
    ",transM,transN,transformCount);
     43         
     44         
     45         
     46     }
     47     
     48     return 0;
     49 }
     50 
     51 
     52 /**
     53  求1的个数
     54 
     55  @param n 所求的数
     56 
     57  @return 传进去的数的二进制形式中1的个数
     58  */
     59 int numberOf1(int n){
     60     int count = 0;
     61     while (n)
     62     {
     63         if ((n & 1)){
     64             count ++;
     65         }
     66         n = n >> 1;
     67         
     68     }
     69     return count;
     70     
     71 
     72 }
     73 
     74 
     75 /**
     76  求一个数二进制形式中1的个数的更优解
     77 
     78  @param n 传进去的待求的参数
     79 
     80  @return 返回的待求参数的二进制形式中1的个数
     81  */
     82 int betterNumberOf1(int n){
     83     
     84     int count = 0;
     85     while(n){
     86         count++;
     87         //每一次做下列操作都会使得这个待求的数的二进制的形式中少1个1 这样的好处是减少比较的次数
     88         n = n & (n-1);
     89     }
     90     return count;
     91 }
     92 
     93 
     94 /**
     95  相关的问题有:
     96     1.当判断一个数字a是否是2的整数次方的时候
     97     2.当判断给定的2个数m,n;
     98     每次改变二进制形式的1个1; 
     99  
    100     m要经过几步转变为n的时候会用到异或;  
    101     异或的结果 的二进制的形式含有几个1 就需要相应的几步转换为对方。
    102  
    103  */
    104 
    105 
    106 /**
    107  判断一个数是否是2的整数次方
    108 
    109  @param n 传进去的待求参数
    110 
    111  @return 返回的是布尔类型的是否是2的整数次方
    112  */
    113 _Bool judgeIs2Cifang(int n){
    114     
    115     return (n & (n-1))? 0 : 1;
    116 }
    117 
    118 
    119 
    120 /**
    121  两个数的二进制的形式相互转换的时候需要改动的次数
    122 
    123  @param p 参数p
    124  @param q 参数q
    125 
    126  @return 返回p q相互转换所需的次数
    127  */
    128 int numberOfTransform(int p, int q){
    129     
    130     int count = betterNumberOf1(p ^ q);
    131     return count;
    132     
    133 
    134     
    135 }
    我会不定期分享 iOS 相关技术文章
  • 相关阅读:
    c++好习惯
    mysql:表
    负载均衡
    KBEngine:架构
    skynet的一些运维数据
    Linux学习—LVM快照功能
    跳跃表
    SQL --Chater03 聚合与排序
    SQL --Chapter02 查询基础
    SQL---Chapter01 数据库和SQL
  • 原文地址:https://www.cnblogs.com/ITCoderW/p/6108068.html
Copyright © 2020-2023  润新知