统计一个数二进制数中1的个数

本文介绍了一种使用C语言实现的统计整数中1的个数的方法,并通过分治思想逐步简化问题,最终给出一种高效算法。该算法不仅展示了位运算的魅力,还提供了详细的代码实现。
#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的个数。

呵呵,看不到吧!

转载于:https://my.oschina.net/nibnat/blog/181755

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值