1. 程式人生 > >面試:快速判斷一個數是否是2的冪次方,若是,並判斷出來是多少次方!

面試:快速判斷一個數是否是2的冪次方,若是,並判斷出來是多少次方!

/**********************************************************************
將2的冪次方寫成二進位制形式後,很容易就會發現有一個特點:
二進位制中只有一個1,並且1後面跟了n個0;
因此問題可以轉化為判斷1後面是否跟了n個0就可以了。
如果將這個數減去1後會發現,僅有的那個1會變為0,
而原來的那n個0會變為1;
因此將原來的數與去減去1後的數字進行與運算後會發現為零。
最快速的方法:
(number & number - 1) == 0
原因:因為2的N次方換算是二進位制為10……0這樣的形式(0除外)。
與上自己-1的位數,這們得到結果為0
例如:8的二進位制為1000;8-1=7,7的二進位制為111。兩者相與的結果為0。計算如下:
    1000
&   0111
-------
    0000
******************************************************************/
#include <iostream>
using namespace std;

int right_move(int value)
{
	int x = 0;
	while (value>1)
	{
		value >>= 1;
		x++;
	}
	return x;
}

int main()
{
	int num;
	printf("please input a inter:");
	scanf("%d",&num);
	if (num&(num-1))
	{
		printf("%d is not the power number of 2:\n",num);
	}
	else
	{
		printf("%d is the power number of 2,the power is %d:\n", num, right_move(num));
	}

}