1)8bit二进制数
1.1)方法一
#include<iostream>
using namespace std;
typedef unsigned char BYTE;
int Count(BYTE v)
{
int num=0;
while(v)
{
if(v%2==1)num++;
v/=2;
}
return num;
}
int main()
{
BYTE v=0xff;
cout<<Count(v)<<endl;
return 0;
}
1.2)方法二(使用位操作)
#include<iostream>
using namespace std;
typedef unsigned char BYTE;
int Count(BYTE v)
{
int num=0;
while(v)
{
num+=v&0x01;
v>>=1;
}
return num;
}
int main()
{
BYTE v=0xff;
cout<<Count(v)<<endl;
return 0;
}
1.3)方法三
#include<iostream>
using namespace std;
typedef unsigned char BYTE;
int Count(BYTE v)
{
int num=0;
while(v)
{
v&=v-1;
num++;
}
return num;
}
int main()
{
BYTE v=0xff;
cout<<Count(v)<<endl;
return 0;
}
1.4)方法四(使用分支操作)
1.5)方法五(查表法)
2)32bit二进制数
2.1)方法六
#include<iostream>
using namespace std;
int Count(unsigned v)
{
v=(v&0x55555555)+((v>>1)&0x55555555);
v=(v&0x33333333)+((v>>2)&0x33333333);
v=(v&0x0f0f0f0f)+((v>>4)&0x0f0f0f0f);
v=(v&0x00ff00ff)+((v>>8)&0x00ff00ff);
v=(v&0x0000ffff)+((v>>16)&0x0000ffff);
return v;
}
int main()
{
unsigned v=0xffffffff;
cout<<Count(v)<<endl;
return 0;
}
2.2)方法七(MIT HAKMEM)
#include<iostream>
using namespace std;
int Count(unsigned v)
{
v-=((v>>1)&033333333333)+((v>>2)&011111111111);
return ((v+(v>>3))&030707070707)%63;
}
int main()
{
unsigned v=0xffffffff;
cout<<Count(v)<<endl;
return 0;
}
求二进制数中0/1的个数
int f(int x)
{
int cnt=0;
while(x)
{
++cnt;
x|=x+1;
}
return cnt;
}
int f(int x)
{
int cnt=0;
while(x)
{
++cnt;
x&=x-1;
}
return cnt;
}