美文网首页程序员
高效率地计算二进制数中1的个数

高效率地计算二进制数中1的个数

作者: liwl23 | 来源:发表于2019-03-18 16:15 被阅读0次

方法一:循环取余相加

int count(DWORD bits){
    while(bits}{
    res += bis%2;
    res /=2;
    }
    return res;
}

方法二:查表
这个方法需要首先初始化一个大小为256的表,在表中记录每个字节对应的1的个数。在计算的时候直接将每个字节对应的个数加起来即可。

/*需要先初始化一个大小为256的表table*/
int count(DWORD bits){
    char* pchar = (char*)((void*)&(bits));
    int res(0);
    for(int i(0);i<4;i++)
        res+=pchar[i];
    return res;
}

方法3:利用位运算
此方法比较抽象,我是从afl源码中学习到的。原理比较难解释,我就不解释了。

/*32位的比特串*/
int count(DWORD bits){
    bits = (bits&0xAAAAAAAA)>>1 + bits&(0x55555555);
    bits =(bits&0xCCCCCCCC)>>2+bits&(0x33333333);
    bits=(bits&0xf0f0f0f0)>>4+bits&0xf0f0f0f;
    bits=(bits&0xff00ff00)>>8+bits&0xff00ff;
    bits=(bits&0xffff0000)>>16+bits&0xffff;
    return bits;
}

相关文章

  • 高效率地计算二进制数中1的个数

    方法一:循环取余相加 方法二:查表这个方法需要首先初始化一个大小为256的表,在表中记录每个字节对应的1的个数。在...

  • 计算一个二进制数中的1的个数

    计算一个二进制数中的1的个数 1.循环法 首先二进制数有这么一个性质,当一个数减去1再与原来的数字去&运算,得到的...

  • 剑指offer----位运算

    1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放...

  • 1.3 题解:计算无符号二进制数中1的个数

    Chapter1: 位运算的奇技淫巧 3. 题解:计算无符号二进制数中1的个数 题目 计算无符号整数的二进制表示中...

  • python全栈学习之原码和补码(3)

    一、机器数与真值:1、机器数:一个数在计算机中的二进制表示形式,叫这个数的机器数。机器数是带符号的,在计算机用一个...

  • 二进制学习

    1.机器数 一个数在计算机中的二进制表现形式,叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符...

  • Java 原码、反码、补码 详解

    1. 机器数 一个数在计算机中的二进制表现形式,叫做这个数的机器数。一个数的最高位表示符号,0是正数,1是负数。 ...

  • 原码、反码、补码

    关于原码、反码、补码 一、机器数和真值 1.机器数 一个数在计算机中的二进制形式,叫做这个数的机器数。机器数是带符...

  • 算法(一 原码,反码和,补码)

    一, 机器数和真值 机器数一个数在计算机中的二进制表示形式,叫做这个数的机器数. 用二进制数的最高位存放符号,正数...

  • 原码反码和补码(转载)

    机器数 一个数在计算机中的二进制表示形式,叫做这个数的机器数,机器数是带符号的,在计算机中用一个数的最高位存放符号...

网友评论

    本文标题:高效率地计算二进制数中1的个数

    本文链接:https://www.haomeiwen.com/subject/mjfbmqtx.html