質問:数値が2の累乗であるかどうかを判断しますか?
コードを解きます。ビット演算を使用してみると、常に2で除算してモジュラスを取るよりも高速になります。
/**
* 2的n次方的正整数代表:某个位是1,其他位是0
* 负整数代表:连续为0 (取反 + 1 为真实表示的值)
* 1...10
* 1...00
* 1..000
*/
public class BackDemo {
public static boolean valid(int num){
boolean isPositive = (num & (1 << 31)) == 0;
return isPositive ? positive(num) : noPositive(num);
}
public static boolean positive(int num){
int count = 0;
for (int i = 30; i >=0; i--) {
boolean bitIsZero = (num & (1 << i)) == 0;
if(!bitIsZero){
count ++;
continue;
}
}
return (count == 1);
}
public static boolean noPositive(int num){
boolean begin = false;
for (int i = 0; i <= 30; i++) {
boolean bitIsZero = (num & (1 << i)) == 0;
if(begin && bitIsZero){
return false;
}
if(!bitIsZero && !begin){
begin = true;
}
}
return true;
}
}