Проверка является ли число степенью 2, на 0 ничего не выводит
учусь Java. Одно из заданий написать программу, которая будет проверять является ли число степенью двойки. Я написал следующий код, но на 0 он ничего не выводит и я не понимаю почему.
public static void main(String[] args) {
int namber = 0;
namber = Math.abs(namber);
boolean yesNoot;
while (namber%2==0){
namber=namber/2;
}
if (namber !=1)
yesNoot = false;
else
yesNoot = true;
System.out.println(yesNoot);
При чём другой вариант решения, который я нашёл в интернете реагирует на 0 точно также:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Input num: ");
int num = in.nextInt();
while (num != 1 && num % 2 == 0) {
num /= 2;
}
System.out.println(num == 1 ? "YES" : "NO");
}
Ответы (3 шт):
Автор решения: Aziz Umarov
→ Ссылка
А если так
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Input num: ");
int num = in.nextInt();
while (num != 1 && num % 2 == 0 && num > 0) {
num /= 2;
}
System.out.println(num == 1 ? "YES" : "NO");
}
Автор решения: zTrap
→ Ссылка
Самый быстрый вариант, это посмотреть на биты в числе. Если "включён" (равен единице) только один бит, число - степень двойки.
private void isPowerOfTwo(int number) {
if (Integer.bitCount(number) == 1) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
На основе этого можно быстро найти следующую ближайшую степень двойки относительно вводимого числа. Нужно лишь взять самый высокий (левый бит) и сместить его ещё левее.
private void nextPowerOfTwo(int number) {
if (Integer.bitCount(number) == 1) {
// здесь используется long для того, чтобы при смещении бита у нас не переполнился int
// актуально если ввести число Integer.MAX_VALUE
long highestBit = Integer.highestOneBit(number);
System.out.println(highestBit << 1);
} else {
System.out.println(number);
}
}
Автор решения: Drugs
→ Ссылка
Вот пожалуйста - универсальный метод по определению - является ли число степенью двойки.
public static void main(String[] args) {
int a = -2;
isPowerOfTwo(a);
}
public static boolean isPowerOfTwo(int value) {
if (Integer.bitCount(Math.abs(value)) == 1) {
return true;
} else {
return false;
}
}