一個(gè)數是2的冪次方,那么這個(gè)數的二進(jìn)制位數中,只能有一位數值為1.
例如:10000, 100, 1等等。
從中可以看到,如果把這個(gè)數減去1,那么結果值的2進(jìn)制位應該如下:1111,11,0等等。
這兩個(gè)數的特點(diǎn)是:他們做或的時(shí)候,得到的結果是他們的和,例如:
10000和1111的或結果是11111, 100和11的或值是111,1和0的或是1。
所以我們可以如果實(shí)現一個(gè)方法判斷一個(gè)數是否是2的冪次方:
public static boolean is2Power(int number){if(number<=0){return false;}return (number|(number-1))==(2*number-1);}
做一個(gè)測試:
for(int i = 0;i<1000;i++){if(is2Power(i)){System.out.println(i);}}
得到的結果是:
1248163264128256512
補充(另一種實(shí)現方法):
也可以通過(guò)對1的移位來(lái)實(shí)現。還是上面說(shuō)的,如果一個(gè)數是2的冪,那么它的二進(jìn)制表示中就只有一位1,所以如果對數1進(jìn)行移位操作,總會(huì )在移到某個(gè)位的時(shí)候和這個(gè)數相等。所以這個(gè)實(shí)現如下:
public static boolean is2Power(int number){int j = 1;while (number>j) {j<<=1;}return j==number?true:false;}
驗證:
for(int i = 0;i<10000;i++){if(is2Power(i)){System.out.println(i);}}
結果:
12481632641282565121024204840968192
聯(lián)系客服