首页 > 试题广场 >

如果x=2014,下面函数的返回值是()

[单选题]
如果x=2014,下面函数的返回值是()
int fun(unsigned int x){
     int n = 0;
     while(x + 1){
         n++; 
         x = x | (x + 1);
     }
     return n;
}
  • 20
  • 21
  • 23
  • 25
推荐
返回值为:23
2014对应的二进制为:0000 0000 000 0000 0000 0111 1101 1110
而x|(x+1)的作用是对一个数中二进制0的个数进行统计
例如本题:
第一次循环:0000 0000 000 0000 0000 0111 1101 1110 |0000 0000 000 0000 0000 0111 1101 1110 =0000 0000 000 0000 0000 0111 1101 1111
第二次循环:0000 0000 000 0000 0000 0111 1101 1111 |0000 0000 000 0000 0000 0111 1110 0000 =0000 0000 000 0000 0000 0111 1111 1111
.
.
.
每循环一次0的数量减一 ,直到溢出 
所以2014二进制中一共有23个0则返回值为23
编辑于 2015-01-29 10:47:39 回复(3)
x&(x-1)统计1的个数,x|(x+1)统计0的个数
发表于 2015-08-26 09:58:45 回复(12)
答案:23
这个作用是对整型中0的个数进行统计,x=x|(x+1);的作用是每次循环把x的二进制中从右往左数的最后一位0变成1,直道变成全1的时候x+1就溢出为全0,循环结束。
2014的二进制是0000 0000 000 0000 0000 0111 1101 1110,所以结果是23
还有类似的题目,迭代式为x=x&(x-1),作用是统计x二进制中1的个数
发表于 2015-01-28 10:27:54 回复(3)
 x=x|(x+1);每次都将x从右往左第一个0变成1,直至全部变成1并溢出,因此答案为32-(x二进制中1的个数)
发表于 2015-04-10 17:02:12 回复(0)
n=1 : 11111011110     | 11111011111      = 11111011111
n=2 : 11111011111     | 11111100000      = 11111111111     11个1
n=3 : 11111111111     | 100000000000     = 111111111111    12个1
n=4 : 111111111111    | 1000000000000    = 1111111111111
...
n=? : ... 32个1

停止条件:x == 32个1的时候,x+1变为0。

找到了这个规律这个问题就可解了。

另外,可以发现每次循环x对应的二进制中0的个数递减,因此,x中0的个数即为最终结果。

答案:23
发表于 2015-01-19 21:58:22 回复(0)
while((x+1))   //当x=-1时退出循环,就是当x的二进制表示形式全为1的时候,退出循环,而x=x|(x+1)的作用在于把x最低位的0改成1。
2014 = 1024 + 512 +256 +128 + 64 + 16+8 + 4 + 2
所以共9个1,4*8 - 9 = 23 
发表于 2018-01-23 02:27:33 回复(2)
x=x|(x+1)对x二进制中0的个数进行统计
x=x&(x-1)对x二进制中1的个数进行统计
发表于 2016-10-07 09:50:04 回复(1)
实际转化为十六进制再转化为二进制,2014=0x7DE=0111 1101 1110B,因为是还要考虑int类型内存大小,所以2014=0000 0000 000 0000 0000 0111 1101 1110B
发表于 2018-07-23 21:13:43 回复(0)
谁说是32位的
发表于 2017-04-06 10:48:01 回复(3)
void dec2Bin(unsigned int n){
	for(int i=1;i<=32;++i){
		cout<<(n&1);
		n >>=1;
	}
	cout<<endl;
}

int fun(unsigned int x)
{
     int n=0;
     while((x+1))
     {
     	 dec2Bin(x);
         n++;
         x=x|(x+1);
         
     }
     return n;
}
自己写程序跑了一下,这样我一下就看清楚了。
发表于 2017-03-23 22:35:54 回复(3)
x&(x-1)统计1的个数,x|(x+1)统计0的个数。
发表于 2022-03-06 20:23:56 回复(0)
这里的x=x|(x+1)就是指将x的二进制值从左向右寻找0依次替换为1当x等于2014其二进制为0000 0000 0000 0000 0000 0111 1101 1110我们可以发现其二进制一共存在23个0,所以在其替换完后出现溢出,这时while循环就会结束,所以输出n的值为23
发表于 2019-09-25 14:12:01 回复(0)
修改楼上老哥的代码
#include<iostream>
using namespace std;
void dec2Bin(unsigned int n)
{
for (int i = 31; i>=0; i--) {
cout << ((n>>i) & 1);
}
cout << endl;
}
int fun(unsigned int x)
{
int n = 0;
while ((x + 1))
{
dec2Bin(x);
n++;
x = x | (x + 1);
}
return n;
}
int main()
{
int n=2014;
int a=fun(n);
cout << a;
system("Pause");
return 0;
}

编辑于 2019-04-27 15:33:58 回复(0)
总结规律,每一次循环0的数量减1
发表于 2016-07-08 22:30:18 回复(0)
此题最关键的是要清楚x|x+1的运算机制。例如:2|3结果是右边的3,3|4结果是4+1,但是7|8结果是15,大家应该可以看出规律了吧。还有要知道此时的无符号整型的值范围是0~65535
发表于 2016-04-22 23:23:49 回复(2)
x=x|(x+1)相当于每次填补一个2014的二进制位的一个0,即从低位开始把0变成1;
当x为unsigned int的最大值时,加1为0;退出。所以x二进制表示里有几个0,那边答案就是个数
所以选 C
发表于 2015-04-09 13:51:00 回复(0)
答案:C
2014化为32位二进制数为0000 0000 0000 0000 0000 0111 1101 1110
在循环中每次x+1都会导致比原数多一个位变成1。
2014的二进制数总共存在23个零位,所以在23次循环后二进制码会出现全1,再加1会出现溢出变为0。
循环结束返回23
发表于 2015-03-26 11:10:34 回复(0)
while(x-1){n++;x=x|x-1;} 是求x二进制表示中1的个数,本题考察的是0的个数
发表于 2018-04-04 17:12:13 回复(0)
挺有意思的,这种应该就记住
发表于 2024-03-09 19:21:48 回复(0)
不是unsigned int吗,怎么循环全1的时候会等于-1?不应该溢出吗全一,为什么解释是等于负一?
发表于 2023-11-15 09:01:02 回复(0)
答案:C 2014化为32位二进制数为0000 0000 0000 0000 0000 0111 1101 1110 在循环中每次x+1都会导致比原数多一个位变成1。 2014的二进制数总共存在23个零位,所以在23次循环后二进制码会出现全1,再加1会出现溢出变为0。 循环结束返回23
发表于 2022-08-13 14:56:14 回复(0)