判斷乙個數是不是2的冪

2022-02-18 07:40:28 字數 1474 閱讀 7331



我們經常會遇到這樣乙個問題,就是判斷某個資料是否為2的n

次方(1,2,4,8,16...

)。例如如果使用者輸入的不是

2^n,則要求使用者重新輸入。為了說明這種判斷演算法,我首先構造乙個測試程式,**如下:

#include #include int main()

}end =clock();

printf("the total time is: %lf",((double)(end-start))/clocks_per_sec);

return 0;

}

一般人很容易想到下面的演算法:

int is2power(long unsigned int num)

}return 0;

}該演算法很容易理解,但是效率不算特別高,在我的機器上的測試結果為:

the total time is: 28.566000

,有人提出,其中的i*=2

,可以用

i<<=1

來替換,效率應該會高一些,我們可以嘗試一下:

int is2power(long unsigned int num)

}return 0;

}在我的機器上的測試結果為:

the total time is: 27.821000

,我們發現僅僅提高了不到一秒,基本可以忽略不計。又有人提出,我們可以採取另一種思路,讓i

從num

開始每次除

2來判斷,如果餘數不為

0立即返回,這樣能會快判斷出那些不符合條件的值,這樣便能加快判斷速度。

int is2power(long unsigned int num)

}return 1;

}這種演算法在我的機器上的測試結果為:

the total time is: 3.958000

,可以看出效率提高了近8

倍。這時又有大神提出,由於2的

n次方的數二進位制表示是第1位為

1,其餘為0,而

x-1(假如x為

2的n次方)得到的數的二進位制表示恰恰是第1位為

0,其餘為

1,兩者相與,得到的結果就為

0,否則結果肯定不為

0。於是誕生了如下演算法:

int is2power(long unsigned int num)

簡單的有點嚇人,而且效率也很高,在我的機器上的測試結果為:

the total time is: 1.484000

,當然也有乙個類似的演算法,原理類似:

int is2power(long unsigned int num)

這種演算法在我的機器上的測試結果為:

the total time is: 1.503000

很簡單的問題,只要我們仔細研究一下還是有不少收穫的。

注:文中的演算法僅說明了相對的效率問題,魯棒性並沒有測試,如果你在實際情況中使用,需要注意一下邊界值和反常輸入情況。

判斷乙個數是不是2的冪

將2的冪次方寫成二進位制形式後,很容易就會發現有乙個特點 二進位制中只有乙個1,並且1後面跟了n個0 因此問題可以轉化為判斷1後面是否跟了n個0就可以了。如果將這個數減去1後會發現,僅有的那個1會變為0,而原來的那n個0會變為1 因此將原來的數與去減去1後的數字進行與運算後會發現為零。最快速的方法 ...

判斷乙個數是不是2的整數次冪

用位運算 二進位制數的位權是以2為底的冪,如果乙個整數 m 是 2 的 n 次冪,那麼轉換為二進位制之後只有最高位為 1,其餘位置為 0,再觀察 m 1 轉換為二進位制後的形式以及 m m 1 的結果,例如 2 0000 0010 1 0000 0001 2 1 0000 0010 0000 000...

確定乙個數是不是2的冪

昨天看到淘公尺網路的一道程式設計題,給定乙個數判斷這個數是不是2的冪。我自己想到的使用遞迴的方法進行實現,如下。class squ2 public static boolean is2 int a if a 2 1 return is2 a a 2 不過我乙個同學用了乙個更加簡便的方法 用這個數和比...