首页 > 试题广场 >

f(2486)的返回值是()

[单选题]
函数
int f(unsigned int n) {
    unsigned int m = 0;
    for (m = 0; n; ++m) {
        n &= (n - 1);
    }
    return m;
}
f(2486)的返回值是()
  • 7
  • 10
  • 15
  • 1243
比较完整的答案:
//求二进制数 1 的个数
int numOfOne(x){
int count = 0;
while(x)
    {count++;
     x = x&(x-1); }return count;
}
//那么求二进制中 0 的个数呢?好的,以下就是: 
int numOfZero(x)
while(x+1)
    {count++;
     x = x|(x+1); }return count;
}

这道题求的时候也有技巧,一般都要先转化成16进制,再转化成二进制,
那么这里 2486 = 2048 + 438(没骂人^()^),已知2048 = 2^n,
n管他是多少,也就是说2048中只有一个1,第一个。
所以只需要求438中1的个数再加上1,就是总1的个数。
做题中的一点小悟,逐享之。

编辑于 2016-07-31 16:29:45 回复(12)
n&=(n-1)相当于n=n&(n-1),执行一次也就相当于把二进制中的最低位的1置为0;循环执行,也就是计算2468的二进制中有多少个1.
发表于 2016-07-06 18:45:14 回复(2)
2486=2048 + 256 + 128 + 32 + 16 + 4 + 2 七个1
发表于 2016-09-17 08:20:05 回复(3)
n&=(n-1)这题语句代表的是与运算,所以联想到二进制。
将2486转换成十六进制9B6 H 然后通过8421码快速转换成二进制1001 1011 0101
2486 = 1001 1011 0101
所以n&(n-1)为
2486&2486-1
等价于
第一次循环:
1001 1011 0101
1001 1011 0100
----------------------
1011 1011 0100
第二次循环:
1011 1011 0100
1011 1011 0011
----------------------
1011 1011 0000
从这我们可以发现规律,m就是求2486二进制1的个数,所以选A=7
发表于 2017-11-22 17:03:45 回复(1)
这道题我的做法是从小数字入手,找规律.
当n是10时,循环2次退出循环    10=1100
当n是14时,循环3次退出循环    10=1110
于是我大胆猜测:
    数字的二进制中,有几个"1",就会循环几次!
我也看了有些人的解析,是从严谨的证明方面证明出来的,一看就是有功底的大湿
但是我认为在真正的面试中,没有机会系统的去证明,还是我这种耍小聪明的做法比较实际
发表于 2016-09-21 00:26:59 回复(0)
n&=(n-1),就是去掉二进制表示最右边的1
发表于 2016-03-01 21:51:31 回复(4)
代码运算的底层原理,应该还算比较简洁
发表于 2021-11-02 20:58:21 回复(0)
二进制1的个数
发表于 2015-11-25 14:47:42 回复(3)
n&(n-1)只能求出最低位有多少个1但最高位还有一个1所以++m
发表于 2017-11-05 09:41:53 回复(0)
for循环中的语句 n&=(n-1)每执行一次则n的二进制表示中的1就会少一个,故m最终的值就是n的二进制表示中的1的个数 
发表于 2017-06-26 23:24:19 回复(0)
没算直接排除法了,1的个数肯定小于10
发表于 2016-02-25 14:36:07 回复(0)
n&=(n-1)这题语句代表的是与运算,所以联想到二进制。 将2486转换成十六进制9B6 H 然后通过8421码快速转换成二进制1001 1011 0101 2486 = 1001 1011 0101 所以n&(n-1)为 2486&2486-1 等价于 第一次循环: 1001 1011 0101 1001 1011 0100 ---------------------- 1011 1011 0100 第二次循环: 1011 1011 0100 1011 1011 0011 ---------------------- 1011 1011 0000 从这我们可以发现规律,m就是求2486二进制1的个数,所以选A=7
发表于 2021-12-24 10:21:56 回复(0)
答案是A
发表于 2020-08-31 12:13:03 回复(0)
原谅我是化为16进制,一个个算然后得出规律的,感觉回到了小学找规律!
发表于 2019-01-23 20:36:55 回复(0)
2486=2048+256+128+32+16+4+2.其中有7个1
发表于 2018-10-27 22:16:37 回复(0)
有问题啊,有5个二进制1啊
发表于 2016-02-18 19:32:31 回复(2)
我的思路,首先要明白这题n &= (n - 1);是为了减少二进制位上的1,也就是说,二进制位上的1有几位就表示循环几次。
那么就可以考到十进制转二进制的知识,我自己习惯用两种方法,一种是记2的次方,然后相加,就像13=8+4+1=2^3+2^2+2^0,那么就在对应位置上写1,二进制:1011。
另一种就是除二取余....
发表于 2023-01-26 23:43:49 回复(0)
2 4 8 16 32 64 128 256 512 1024 2048 2048+256+128+32+16+4+2
发表于 2022-11-15 14:23:43 回复(0)
有多少个1,m就加几次
发表于 2022-07-16 09:40:51 回复(0)
就看几个1
发表于 2022-03-16 17:33:26 回复(0)