首页 > 试题广场 >

下面函数的返回值是?

[单选题]
假设x=9981,下面函数的返回值是?
int func(x)
{
    int countx=0;
    while(x)
    {
        countx++;
        x=x&(x-1);
    }
    return countx;
}

  • 7
  • 10
  • 9
  • 6
B,先转2进制为10011011111101,每次x&(x-1)会让原来的1(从低位到高位依次)变为0。一共10个1,10次循环之后x为0,退出循环。
发表于 2015-09-17 20:16:17 回复(2)
把这么大的数字转换成2进制才是我懵逼的地方、。。。
发表于 2016-03-23 15:54:04 回复(11)
由于二进制数每个位置上不是1就是0 ,假设有数X ,则 x-1必然会从x的某一位借位。
恰好&操作,同为1才真 。 (在二进制数操作中 &经常被用来清零,| 操作被用来置数)。
因此x&(x-1)会记录两个数相差的1的个数。
发表于 2015-09-19 13:46:59 回复(1)
9981=8192+1024+512+128+64+32+16+8+4+1
10个1
发表于 2018-01-20 11:04:20 回复(0)
B
9981 转化为2进制为 0010 0110  1111 1101 为10个1
转化为2进制中1的个数
详细见《剑指OFFER》 位运算 二进制中1的个数


发表于 2015-09-17 19:46:18 回复(1)
其实这个题目就是求x的二进制表达中1的个数,将9981转化为十六进制为26FD,二进制为0010 0110 1111 1101 ,一共有10个1,因此选10
发表于 2017-05-24 10:42:04 回复(0)
B
求9981二进制中1的个数
发表于 2015-09-17 12:31:05 回复(2)
其实这是一个转换成二进制,然后数1的个数的题目
发表于 2021-02-24 20:28:57 回复(0)
x=9981 1.将10进制数9981转换为16进制数26FD (用的常规的除16取余) 2.将26FD转换为2进制0010 0110 1111 1101 总共10个1 3.分析x&(x-1)知语句能够实现将一个二进制数从右向左清零,例:x=1011,x-1=1010,x&(x-1)=1010,以此类推 4得到答案10个1需要10次
发表于 2019-08-04 09:26:52 回复(0)
没有什么意思吧,搞这么大😑
发表于 2019-05-16 14:57:46 回复(0)
首先,这道题是求x的二级制表示的数中1的个数
求二进制中1的个数,还有一种方法是依次右移1bit,并&1进行计算。
向右移位1=除2
9981 ->4990->2495->1247->623->311->155->77->38->19->9->4->2->1->0
 统计其中的奇数即可
发表于 2019-04-29 08:10:30 回复(0)
B
求9981二进制中1的个数
发表于 2015-09-18 22:13:47 回复(0)
对x=x&(x-1)进行分析 一、例如: x=1011,x-1=1010,公式后x=1010 x=1010,x-1=1001,公式后x=1000 x=1000,x-1=0111,公式后x=0000 猜想规律,公式会将二进制中为1的位清零,从右向左,且每次清零一位,直至所有位为0. 二、证明: 假设X=A(N)...A(i)...A(1)表示N位二进制数,其中A(i) 取值1或0,i=1...N。令L=X&(X-1),Y=X-1. 运算分为两种情况: 一种情况:若A(1)=1,则L=A(N)...A(2)1 & A(N)...A(2)0=A(N)...A(2)0。 第二种情况:若A(1)=0,则需向高位且第一个为1的位A(i)借位,X简化为A(N)...A(i+1)10...A(j)...0,其中A(i)=1,A(j)=0,其中j=1...i-1,借位结果是A(1)到A(i)之间所有位的值取反~,Y=A(N)...A(i+1)0 111...1111,那么X=X&Y=A(N)...A(i+1)0...A(j)...0,实现A(i)=0,即右数第一个1清零,且只一位清零。 下面进行运算: 第一次运算: 若A(1)=0,则按第二种情况进行运算,最终结果X=A(N)...A(2)0。 若A(1)=1,则按第一种情况进行运算,最终结果 X=A(N)...A(i+1)0...A(j)...0,其中j=1...i。 第K次运算:按第二种情况进行运算,使K-1次运算结果右数第一位1变为0。 除第一次外,其他次运算全部按第二种情况进行。最终所有位清零。 三、回到题目上: countx作用记循环体执行次数,也就是使x从9981变为0,需要L=x=x&(x-1)运算次数。x=9981 =10011011111101,经过上面分析,可知,执行一次L运算,也就是每次从右找个1清0,找个1清零,直至x=0退出循环,共10个1,即10次循环。
发表于 2018-05-25 12:52:30 回复(1)
为啥要转成二进制算?
发表于 2021-04-01 14:25:33 回复(0)
这题就是计算9981转换成二进制后有多少个1
编辑于 2021-03-27 21:30:34 回复(0)
我还以为只是一个和取的bool运算。
发表于 2020-10-23 18:52:03 回复(0)
这数也太大了。。在地铁上用手机刷题的我根本不知道用什么办法转换成二进制
发表于 2020-09-24 07:49:05 回复(0)
x与x-1在变成二进制时会相差1,按位与是这个相差的以变为0,所以只需要知道x化为二进制
有多少个1就可以知道要按位与几次
发表于 2020-04-22 15:27:55 回复(0)
对不起我居然**的一位一位的换成了1001 1001 1000 0001我是***
发表于 2019-10-22 11:02:56 回复(0)
遇到这种代码段,就是求数的二进制中有多少个1
发表于 2019-08-07 22:11:06 回复(0)