matlab获取2的整数次幂,如何快速判断正整数是2的N次幂
這個(gè)問(wèn)題可能很多面試的人都遇到過(guò),很多人可能想利用循環(huán)來(lái)判斷,代碼可能如下所示: 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;
}
上面的代碼簡(jiǎn)單明了。但是,這樣的方案效率比較低。我們仔細(xì)分析一下,正整數(shù)是2的n次冪他有什么規(guī)律?20=1,21=2,22=4,23=8....這樣看是沒有什么規(guī)律的。但是如果將2的冪次方寫成二進(jìn)制形式后,很容易就會(huì)發(fā)現(xiàn)有以下兩個(gè)特點(diǎn):
1、20=1 -> 0001,21=2 -> 0010,22=4?->? 0100,23=8 ?->?1000二進(jìn)制中只有一個(gè)1,并且1后面跟了n個(gè)0。
2、如果將這個(gè)數(shù)減去1后會(huì)發(fā)現(xiàn),僅有的那個(gè)1會(huì)變?yōu)?,而原來(lái)的那n個(gè)0會(huì)變?yōu)?;因此將原來(lái)的數(shù)與去減去1后的數(shù)字進(jìn)行與運(yùn)算后會(huì)發(fā)現(xiàn)為零((x & x- 1) == 0)。
原因:因?yàn)?n換算是二進(jìn)制為10……0這樣的形式,2n-1的二進(jìn)制為0111...1,兩個(gè)二進(jìn)制求與結(jié)果為0,例如:16的二進(jìn)制為10000;15=01111,兩者相與的結(jié)果為0。計(jì)算如下:
10000
&01111
-------
00000
所以可以用下面 public static boolean isPowerOfTwo(int x) {
return x > 0 & (x & (x - 1)) == 0;
}
很簡(jiǎn)單的一行代碼就實(shí)現(xiàn)了。細(xì)心的讀者可能會(huì)問(wèn):2的n次冪二進(jìn)制始終都是只有一個(gè)1,其它的位數(shù)都為0,是否可以判斷給定的數(shù)轉(zhuǎn)換為二進(jìn)制來(lái)判斷其中是否只有1個(gè)1來(lái)得出給定數(shù)是否為2的n次冪呢?答案是不能。因?yàn)镮nteger.MIN_VALUE的二進(jìn)制只有1個(gè)1,但是Integer.MIN_VALUE并不是2的n次冪,所以不能用上面方式來(lái)實(shí)現(xiàn)。(完)
總結(jié)
以上是生活随笔為你收集整理的matlab获取2的整数次幂,如何快速判断正整数是2的N次幂的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简谐运动的合成
- 下一篇: matlab人脸追踪,求大神帮助我这个菜