方法一:循环取余相加
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;
}
网友评论