首页 > 试题广场 >

下面程序执行输出结果为

[单选题]
下面程序执行输出结果为()
#include <stdio.h>
int fun(int i) {
    int cnt = 0;
    while(i) {
        cnt++;
        i = i&(i-1);
    }
    return cnt;
}

int main() {
    printf("%d\n", fun(2017));
    return 0;
}
  • 6
  • 7
  • 8
  • 9
i = i & (i-1),统计i二进制中有多少个1
i = i | (i+1),统计i二进制中有多少个0
发表于 2021-01-16 11:43:51 回复(1)
2017的二进制是11111100001,有7个1
n&(n-1)就是从右往左数1的个数
举例:
第一步:刚开始n=11111100001!=0,count=1,n=11111100001&11111100000=11111100000,最右边第一个1
第一步:n!=0,n=11111100000&11111011111=11111000000,最右边第二个1
……
以此类推
这是剑指offer上面关于位运算的题目
发表于 2019-08-15 16:07:02 回复(5)
i = i & (i-1),统计i二进制中有多少个1
i = i | (i+1),统计i二进制中有多少个0
发表于 2021-12-03 09:22:41 回复(0)
把1的个数算错的应该不止我一个人吧
发表于 2020-03-01 16:30:34 回复(1)
2017=1024+ 512  +256  +128 + 64 +32  +1
即七个1,程序的目的是计算1的个数,所以选7
发表于 2021-04-10 23:38:10 回复(0)

i&(i-1)统计二进制1的个数

发表于 2020-02-04 16:10:42 回复(0)
求其二进制中一的个数
发表于 2018-12-21 18:14:42 回复(1)
我tm直接发动辗转相除术
发表于 2022-06-23 11:13:14 回复(0)
i = i & (i-1),统计i二进制中有多少个1
i = i | (i+1),统计i二进制中有多少个0
发表于 2023-01-10 20:28:21 回复(0)
2048-31 2048等于11个1再加一 2017=2048-31 31是6个1 11-6+1等于7 脑算即可
发表于 2022-03-31 13:36:11 回复(1)
i = i & (i-1),统计i二进制中有多少个1 
i = i | (i+1),统计i二进制中有多少个0
发表于 2022-11-22 17:21:42 回复(0)
i = i & (i-1),统计i二进制中有多少个1
i = i | (i+1),统计i二进制中有多少个0
发表于 2022-09-23 15:24:04 回复(0)
醉了。忘了1024有11位
发表于 2022-03-02 23:03:15 回复(0)
i = i & (i-1),统计i二进制中有多少个1 i = i | (i+1),统计i二进制中有多少个0
发表于 2021-11-23 15:30:51 回复(0)
what the *** question???
发表于 2020-09-15 15:04:19 回复(0)
对应剑指offer11题位运算,求1的个数
发表于 2020-03-26 20:38:36 回复(0)