表达式“x&(x-1) ”小探讨。
x&(x-1)表达式。
今天在看笔试题的时候遇到了一个题目,如下:
#include <iostream>
using namespace std;
int fun(int x)
{
int count = 0;
while(x)
{
count++;
x&(x-1);
}
return count;
}
int main()
{
count << func(9999) << endl;
return 0;
}
9999 二进制为:10011100001111。
这道题目的答案是8,做出这道题目并不难,死算的话也不要多长时间,给出的提示是:func的功能是形参x转化成二进制后包含1的数量。为什么会这这样呢,不理解,关键是x&(x-1)这个表达式的作用是什么。于是度娘+谷歌,发现这个表达式还有一些其他的用途。
1:最低的为1的位变成0,这个解释理解起来不难,有了这个解释后就很容易本题的提示了。
2:当x为奇数的时候,x=x&(x-1)它的值相当于x = x-1;一样的效果;当x为2的N次幂时,结果为0,这可以用来快速判断一个数是否为2的n次方。
#include <stdio.h>
int func(int x)
{
if( (x&(x-1)) == 0 )
return 1;
else
return 0;
}
int main()
{
int x = 8;
printf("%d\n", func(x));
}
浙公网安备 33010602011771号