关于位运算的一道笔试题

 求下面函数的返回值  假设x=9999

int fun(int x)
{
int countx=0;
while(x)
{
x=x&(x-1);
countx++;
}
return countx;
}
解答:

fun(x)返回x表示成二进制时“1”位的个数。
9999二进制为10011100001111,里面一共8个1,所以返回8.
以下所说x都为2进制表示。
每次执行循环体,x中最右边为“1”的位都会变成0.详细:
当x末位为1时,如10111,x-1=10110,两者按位与,最右边的1变成0,x变成10110,计数器自增,进入下次循环;
当x末位为0时,如110000,x-1=101111,这时原本为1的左起第二位已经变成0,但后面多出了很多1.现在两者再按位与一下,就消除了这些多余的1,得到100000

也就是说 x&(x-1)每次消除二进制里面的一个1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值