matlab获取2的整数次幂,如何快速判断正整数是2的N次幂
這個問題可能很多面試的人都遇到過,很多人可能想利用循環來判斷,代碼可能如下所示: public static boolean isPowOfTwo(int n) {
int temp = 0;
for (int i = 1; ; i++) {
temp = (int) Math.pow(2, i);
if (temp >= n)
break;
}
if (temp == n) return true;
else return false;
}
上面的代碼簡單明了。但是,這樣的方案效率比較低。我們仔細分析一下,正整數是2的n次冪他有什么規律?20=1,21=2,22=4,23=8....這樣看是沒有什么規律的。但是如果將2的冪次方寫成二進制形式后,很容易就會發現有以下兩個特點:
1、20=1 -> 0001,21=2 -> 0010,22=4?->? 0100,23=8 ?->?1000二進制中只有一個1,并且1后面跟了n個0。
2、如果將這個數減去1后會發現,僅有的那個1會變為0,而原來的那n個0會變為1;因此將原來的數與去減去1后的數字進行與運算后會發現為零((x & x- 1) == 0)。
原因:因為2n換算是二進制為10……0這樣的形式,2n-1的二進制為0111...1,兩個二進制求與結果為0,例如:16的二進制為10000;15=01111,兩者相與的結果為0。計算如下:
10000
&01111
-------
00000
所以可以用下面 public static boolean isPowerOfTwo(int x) {
return x > 0 & (x & (x - 1)) == 0;
}
很簡單的一行代碼就實現了。細心的讀者可能會問:2的n次冪二進制始終都是只有一個1,其它的位數都為0,是否可以判斷給定的數轉換為二進制來判斷其中是否只有1個1來得出給定數是否為2的n次冪呢?答案是不能。因為Integer.MIN_VALUE的二進制只有1個1,但是Integer.MIN_VALUE并不是2的n次冪,所以不能用上面方式來實現。(完)
總結
以上是生活随笔為你收集整理的matlab获取2的整数次幂,如何快速判断正整数是2的N次幂的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简谐运动的合成
- 下一篇: 摇篮式五轴与主轴摆动式五轴加工中心的区别