假定x=500,下面函数的返回值是 ()
int fun(int x) { int countx = 0; while (x) { countx++; x = x & (x – 1); } return countx; }
A. 2 B. 3 C. 5 D. 6
计算一个整数x的二进制表示中包含的1的个数。。其实就是500转换成二进制后有几个一
这行代码 x = x & (x – 1); 在二进制操作中有着特定的作用,主要用于清除(或称为“剥离”)x 的最低位的1(即,将x变成它最大的、比它小的、且是2的幂次方的倍数的数)。这里使用了按位与(bitwise AND)操作。
x = x & (x – 1);
x
让我们分解这个操作来看看它是如何工作的:
x - 1 的操作:当你从x中减去1时,x的最低位的1会变成0,而这个1右边的所有0都会变成1。例如,如果x是二进制数1010(十进制中的10),那么x - 1就是1001(十进制中的9)。
1010
x - 1
1001
按位与操作(&):这个操作将x和x - 1的每一位进行比对,只有当两个相应的位都是1时,结果位才是1;否则,结果位是0。
结果:最终,x中最低位的1以及它右边的所有位都被清零了,而x中这个最低位的1左边的所有位(即,更高的位)保持不变。这意味着x现在变成了它最大的、比它小的、且是2的幂次方的倍数的数。
举个例子:
x = 10
x - 1 = 9
x & (x - 1) = 1010 & 1001 = 1000
这个操作在算法中非常有用,比如用于计算一个数中1的个数(即汉明重量),或者用于实现某些类型的位掩码操作。
自己拿草稿纸算一下,其实就是500转换成二进制后有几个一
啥意思啊这个
LEK 回复 1833958644: 计算一个整数x的二进制表示中包含的1的个数。
D x = 500时,x-1=4...
用户登录可进行刷题及查看答案
D x = 500时,x-1=499,用二进制表示 111110100 x-1为 111110011 当他们执行&运算并赋值给x,结果x为 111110000 x-1 111101111 x 111100000 如此类推到结果为000000000,应该发现x = x&(x-1)就是将x二进制位1变为0。x为500时二进制为1的位有6个,所以结果为6
登录后提交答案