二进制的运算——C

出处——《剑指offer》

题目:实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2。

1.假设要检测9的二进制中1的个数(1001),将其与1(0001)求‘与’来判断其最右边的一位是否为1,可以通过对9(1001)进行循环右移并与1(0001)求‘与’来得到总的1的个数,也可以通过对1(0001)循环左移并与9(1001)求‘与’来得到1的个数。但考虑到当对负数进行右移时,二进制最左边会使用1进行填充,而不是使用0,会使得循环判断条件始终为真,陷入死循环(使用while( n )时),因此采用对1(0001)进行循环左移的方法。

int NumberOf1( int n )

{

    int count = 0;

    unsigned int flag = 1;

    while( flag )        /*循环次数等于整数二进制的位数*/

    {

        if( n & flag )

            count++;

        flag = flag << 1;

    }

    return count;

}

2.进阶解法

把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

例:

第一次循环

12(1100) - 1 = 1011

1011 & 1100 = 1000

第二次循环

1000 - 1 = 0111

0111 & 1000 = 0000

循环结束,count = 2,即1的个数为2个

int NumberOf1( int n )

{

    int count = 0;

    while( n )

    {

        ++count;

        n = ( n - 1 ) & n;

    }

    return count;

}

转载于:https://www.cnblogs.com/liangchao/archive/2012/09/18/2690612.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值