首页 > 试题广场 >

下面程序中, 输出是什么?

[单选题]
下面程序中, 输出是什么?
int fun(int x){
    int count = 0;
    while(x){
        count++;
        x = x &(x-1);
    }
    return count;
}
int main(){
    cout << "fun(2015)=" << fun(2015)<<endl;
}


  • fun(2015)=11
  • fun(2015)=10
  • fun(2015)=9
  • fun(2015)=8
推荐
本题是统计一个数有多少个1的,2015=11111011111共10个1.
编辑于 2014-12-03 09:53:23 回复(2)
你好,答案是B. 10
-------------------------------------------
我的理解是x每次与x-1进行一次与(&)操作,就会导致x二进制中的1减少一个。通过函数func可知,x二进制中有多少位1就会进行多少次与计算。
2015的二进制表示是:11111011111,共有10个1。所以答案是10。
发表于 2014-12-23 15:49:51 回复(0)
首先考虑位数,win32下int占32位。
再次,函数的功能是统计位数为1的个数。
看到2015,我们可以用逆向思维,可以想到2048是2的12次幂,2047是余下的低11位满1,2047 - 2015 = 32;占一位,所以,最后就是11 - 1 = 10;答案是:B
发表于 2017-08-29 22:05:42 回复(3)
2015 = 2048 - 33 = 2047 - 32 
2047 = 2048 -1 为11111111111
2047 - 32 = 111111101111
发表于 2015-09-04 15:07:06 回复(0)
比如一个数x的二进制后面几位是1000. x-1的二进制后面几位变成了 0111. 二者&,变成了0000。而对于原数x的二进制数而言,就从右端减少了一个1。所以上述算法是计算二进制1的个数。
发表于 2015-06-28 09:25:57 回复(1)
直接口算,2^11-1 =2047,共11个1 ,2047-2015=32,32只有一个1,所以剩10个1
发表于 2021-12-06 19:42:46 回复(2)
剑指Offer 上有讲解的。
发表于 2016-08-04 13:00:50 回复(0)
n和n—1相与,可以讲n对二进制中的最后一个1变为0。 因此可以用来统计n所对应的二进制中1的个数
发表于 2021-01-20 08:42:23 回复(0)
结论:x = x &(x-1)可以统计1的个数.
问题:x = x &(x+1)可以统计0的个数?
发表于 2015-09-02 11:57:28 回复(0)
x&(x-1)可以统计1的个数,每执行一次,会减少一个1,2015转换为二进制的话,总共十个1,也就是需要运行十次,count=10,这里的count其实也可以理解为统计1的个数
发表于 2023-07-20 08:28:49 回复(0)
x= x&(x-1)每执行一次就会导致x的二进制中1的个数较少一次
发表于 2022-08-16 12:52:01 回复(0)
像这种循环统计的,是用于查找数值的二进制中有多少个0或1
    while(x){
        count++;
        x = x & (x-1);
    }//统计x的二进制中有多少个1
每一次与运算,x的二进制从低位到高位,遇到bit为1少一个1

    while(x){
        count++;
        x = x | (x+1);
    }//统计x的二进制中有多少个0
每一次或运算,x的二进制从低位到高位,遇到bit为0依次少一个0
发表于 2021-01-30 11:29:40 回复(1)
统计二进制中1的个数,
2015 = 1024+512+256+128+64+16+8+4+2+1
一共10个数相加
发表于 2019-09-04 17:08:17 回复(0)
 只有当while(x)没有意义是,才执行输出Count。  X=11111011111(2015)&(X-1)只要执行10次,就会变成0,然后就会输出count=10.
发表于 2016-12-15 15:24:53 回复(0)
又少数了一个1.
发表于 2016-06-12 15:15:57 回复(0)
2015一共10个1和一个0,每次的&操作都是将对应的二进制位从右到左依次变为0,所以一共10次
发表于 2015-04-27 16:41:27 回复(0)