zoukankan      html  css  js  c++  java
  • 求二进制数中有多少个1

    算法函数代码:

     1 int bit_count_one(unsigned int n)
     2 {
     3     n=(n&0X55555555)+((n>>1)&0x55555555);
     4     printf("%d
    ",n);
     5     
     6     n=(n&0X33333333)+((n>>2)&0x33333333);
     7     printf("%d
    ",n);
     8     
     9     n=(n&0X0f0f0f0f)+((n>>4)&0x0f0f0f0f);
    10     printf("%d
    ",n);
    11     
    12     n=(n&0X00ff00ff)+((n>>8)&0x00ff00ff);
    13     printf("%d
    ",n);
    14     
    15     n=(n&0X0000ffff)+((n>>16)&0x0000ffff);
    16     printf("%d
    ",n);
    17     
    18     return n;
    19 }

    下面我们来详细解说如下代码:

    0X55555555的二进制位01010101010101010101.......

    n&0X55555555意思就是保留0,2,4,6,8.....等偶数位上的1,而(n>>1)&0X55555555是代表保留奇数位上的1,然后两者相加,相加的意思是将相邻的二进制相加,又因为二进制最大为1,1+1=10,用两个字节来存储且不会溢出

    0X33333333的二进制为0011001100110011.........

    与上意思相同,不过是以两个字节为单位,相邻的两个二进制位相加(左两个,有两个)

    正好对应(n>>2)

    0X0f0f0f0f的二进制为000011110000111100001111.......

    总的来说:

    1.用相邻的1位相加

    2.用相邻的2位相加

    3.用相邻的4位相加

    4.用相邻的8位相加

    5.用相邻的16位相加

    实例:用上图二进制来做1101 1001

    第一步,相邻的1位相加  (两个bit存储)

    1+1=10   0+1=01  1+0=01  0+1=01

    所以n=1001 0101

    第二步,相邻的2位相加   (四个bit存储)

    10+01=0011 01+01=0010

    所以n=0011 0010

    第三步,相邻的4位相加    (八个bit存储)

    0011+0010=0000 0101     
     
    由于样例为1个字节所以只有相邻的4的字节相加,当为int型时,则是相邻的16个字节相加
  • 相关阅读:
    华为交换机中hybrid、access、trunk的区别
    debug调试
    网络基础--ICMP
    HCNA---ARP协议
    Python之字典
    python之元组
    网络基础--Telnet、SSH、FTP
    学习Cisco切换为华为的第一天---Telnet
    学思科,考华为,用华三。这是多少人的现况,快来听听我的经历~
    [P3385]【模板】负环 (spfa / bellman-ford)
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/7697753.html
Copyright © 2011-2022 走看看