zoukankan      html  css  js  c++  java
  • 编程之美-02数字之魅-求二进制数中1的个数

    题目:求二进制数中 1 的个数
    对于一个字节(8bit)的无符号整型变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能地高。

    解法一:移位->判断->累计

    解法二:除2->判断->累计

    解法三:v &= (v -1)需要掌握

    int num = 0;
    while(v)
    {
    	v &= (v -1);
    	num++;
    }
    return num;
     

    解法四:分支操作(swicth-case全部可能值),空间换时间。

     

    解法五:查表法(预定义结果表),空间换时间。

     

    解法六:二分法(32位)。

    两两一组相加,之后四个四个一组相加,接着八个八个,最后就得到各位之和了。

    int Count(unsigned x) 
    {   
        x = x - ((x >> 1) & 0x55555555);    
        x = (x & 0x33333333) + ((x >> 2) & 0x33333333);    
        x = (x + (x >> 4)) & 0x0F0F0F0F;    
        x = x + (x >> 8);    
        x = x + (x >> 16);    
        return x & 0x0000003F;    
    } 
     

    解法七:HAKMEM算法。

    三个一组,求出每组中1的个数,然后相邻两组归并,得到六个一组的1的个数,最后很巧妙的用除63取余得到了结果。

    因为2^6 = 64,也就是说 x_0 + x_1 * 64 + x_2 * 64 * 64 = x_0 + x_1 + x_2 (mod 63),这里的等号表示同余。

    这个程序只需要十条左右指令,而且不访存,速度很快。

    int Count(unsigned x) 
    {
        unsigned n;    
        n = (x >> 1) & 033333333333;    
        x = x - n;   
        n = (n >> 1) & 033333333333;   
        x = x - n;    
        x = (x + (x >> 3)) & 030707070707;   
        x = modu(x, 63);  
        return x;   
    } 
     

    其他方法 http://www.cnblogs.com/graphics/archive/2010/06/21/1752421.html

  • 相关阅读:
    CCF CSP 题解
    CCF CSP 2019032 二十四点
    CCF CSP 2018121 小明上学
    CCF CSP 2019092 小明种苹果(续)
    CCF CSP 2019091 小明种苹果
    CCF CSP 2019121 报数
    CCF CSP 2019031 小中大
    CCF CSP 2020061 线性分类器
    CCF CSP 2020062 稀疏向量
    利用国家气象局的webservice查询天气预报(转载)
  • 原文地址:https://www.cnblogs.com/lucas-hsueh/p/3737735.html
Copyright © 2011-2022 走看看