#include<stdio.h>
void printbits(unsigned int x);
//统计x二进制形式1的个数并返回
int CountBits (unsigned int x )
{
unsigned int a = 0;
unsigned int b = 0;
static unsigned int mask[] = { 0x55555555,
0x33333333,
0x0F0F0F0F,
0x00FF00FF,
0x0000FFFF
} ;
int i ;
int shift ; /* Number of positions to shift to right*/
for ( i =0, shift =1; i < 5; i ++, shift *= 2)
{
a = (x & mask[ i ]);
b = ( ( x >> shift) & mask[i]);
printf("a=");
printbits(a);
printf(",b=");
printbits(b);
x = a + b;
printf(",a+b=");
printbits(x);
printf("\n");
}
return x;
}
//打印一个数的二进制形式,0-255,可以自己修改
void printbits(unsigned int x)
{
int val = x;
int i = 1 ;
unsigned int a[32] = {0};
while( x / 2 )
{
a[ i++ ] = x % 2;
x /= 2;
}
a[ i ] = x;
if( i % 4 != 0 )
i = ( ( i / 4 ) + 1 ) * 4 ;
printf("%d ",val);
for( ; i >= 1 ; i-- )
{
if( i % 4 == 0 )
printf(" ");
printf("%d",a[ i ]);
}
}
int main()
{
while(1)
{
unsigned int a = 5;
scanf("%d",&a);
printbits(a);
printf("\n");
printf("%d\n",CountBits(a));
}
return 0;
}
程序的思想其实是一种分治,开始统计相邻的两个位1的个数,然后看做整体,再统计相邻两个数(因为现在把原先的两位看做一位了,看做一个整体),然后同理则是四个数……
距离211这个数,二进制是1101 0011,开始是相邻两个位想加,得到10 01 00 10,然后再相加得到11 10,最后相加得到101,也就是十进制数5,即二进制数211中1的个数。
呵呵,看不到吧!