表达式“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));
}

 

posted on 2012-02-16 17:13  W@SuperC  阅读(459)  评论(0)    收藏  举报

导航