• 计算二进制中1的个数(转)


    /*
        解法一

        将二进制数的各位相加,结果即为1的个数。从两位二进制开始计算。

        55555555 h = 01010101010101010101010101010101 b
        33333333 h = 00110011001100110011001100110011 b
        0f0f0f0f h = 00001111000011110000111100001111 b
        00ff00ff h = 00000000111111110000000011111111 b
        0000ffff h = 00000000000000001111111111111111 b

        1) 奇偶位相加    2) 2位一组相加    3) 4位为一组相加    4) 8位为一组相加    ..
           00->00        0001->0001
           01->01        0101->0010
           10->01        0110->0011
           11->10        1010->0100
                            
    */


    unsigned 
    long func(unsigned long x)
    {
        x 
    = (x & 0x55555555UL+ ((x >> 1& 0x55555555UL);
        x 
    = (x & 0x33333333UL+ ((x >> 2& 0x33333333UL);
        x 
    = (x & 0x0f0f0f0fUL+ ((x >> 4& 0x0f0f0f0fUL);
        x 
    = (x & 0x00ff00ffUL+ ((x >> 8& 0x00ff00ffUL);
        x 
    = (x & 0x0000ffffUL+ ((x >> 16& 0x0000ffffUL);
        
    return x;
    }


    /*
        解法二

        若
        n        = XXXXXX10000 b
        n-1        = XXXXXX01111 b
        n & n-1 = XXXXXX00000 b
        
        将最低位起遇到的第一个1置零,计数器加1
     
    */

    int bit_count(unsigned int n)
    {
        
    int count;
        
    for(count = 0; n; n &= n - 1)
        
    {
            count
    ++;
        }

        
    return count;
    }


  • 相关阅读:
    centos 安装 py 3.0+
    ubuntu下安装多版本Python
    DRF之注册器响应器分页器
    头部随着滚动高度的变化由透明慢慢变成不透明
    悬浮滚动
    判断某天是周几
    正则限制input只能输入大于0的数字
    原生js倒计时
    从两个时间段里分别计算出有几天工作日与周末
    sublime text3连续打出1到10的标签div
  • 原文地址:https://www.cnblogs.com/faraway/p/1243115.html
Copyright © 2020-2023  润新知