您的位置:首页 > 其它

x&(x-1)和x&(-x)的讲解

2016-03-22 18:07 316 查看
x&(x-1)这个表达式有两个作用:

1、去掉x最右边的一个1(二进制)

2、判断一个整数是不是2的n次幂

int func(x)
{
int countx =0;
while(x) {
countx ++;
x = x&(x-1);
}
return countx;
}


这道微软的笔试题,显而易见的是,求x中二进制里面1的个数。

结果其实没什么,重要的是我们要知道为什么x&(x-1)为什么可以达到这样的效果。

关键在于(x-1)一定会把最低位的一个1扯下水,因为需要减1啊。再按位&一下,只会关系到最低的1,自然就可以了。

再看看(x&(-x))是个什么东西,这个的作用就是求出2^p(其中p: x 的二进制表示数中, 右向左数第一个1的位置)

有什么用呢?

在树状数组里面会用到。

还有呢?

int main(){
int x;
while(cin>>x){
cout<<(x&(x-1))<<endl;

int t=x&(-x);
cout<<(x^t)<<endl;
}
return 0;
}


没有发现吗?

这两个输出都是一样的结果。为什么呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: