Java. Вывод битового представления числа, используя цикл
Как показать битовое представление значения переменной типа int, используя только один цикл, управляющую переменную, вывод на консоль и битовые операции?
Нельзя использовать строки и любые другие готовые функции (методы).
BitPresentation.java
public class BitPresentation {
private static int number = 16;
public static void main(String[] args) {
System.out.print("The Number " + number + " in bit presentation: ");
while (true) {
if (number == 0 || number == 1) {
System.out.print(number);
break;
}
System.out.print(number%2);
number >>= 1;
}
}
}
В данном случае консольный вывод должен быть таковым:
The Number 16 in bit presentation: 10000
Но выводит так:
The Number 16 in bit presentation: 00001
Я понятия не имею, как выводить биты числа не в обратном порядке (в соответствии с условием задачи). Я знаю, как сделать это с помощью рекурсии, но здесь нужно использовать лишь цикл.
Ответы (4 шт):
Например так:
public class BitPresentation {
private static int number = 17;
public static void main(String[] args) {
int module = (int) Math.pow(2, 30);
while(module > number) {
module>>=1;
}
System.out.print("The Number " + number + " in bit presentation: ");
while (module > 0) {
System.out.print(number/module > 0 ? 1 : 0);
number%=module;
module>>=1;
}
}
}
Возможно более аккуратный и простой вариант. Он выводит и не значащие нули:
public String toBinaryString(int value) {
StringBuilder result = new StringBuilder(32);
for(int i = 0; i < 32; ++i) {
result.append((value & 1) == 1 ? '1' : '0');
value >>>= 1;
}
return result.reverse().toString();
}
или
public String toBinaryString(int value) {
StringBuilder result = new StringBuilder(32);
for(int i = 0; i < 32; ++i) {
result.append(value & 1);
value >>>= 1;
}
return result.reverse().toString();
}
но второй вариант под капотом преобразует на каждом шаге цикла число в строку, которую потом присоединяет к строке(StringBuilder) что добавляет лишние расходы памяти и ненужных действий.
Вот ещё вариант без вывода незначащих нулей:
public String toBinaryString(int value) {
StringBuilder result = new StringBuilder(32);
do {
result.append(value & 1);
value >>>= 1;
} while(value != 0);
return result.reverse().toString();
}
Используя полученные ответы от пользователей @Barmaley и @Miron, мне удалось реализовать алгоритм, который выводит битовое представление числа (положительного, отрицательного и нуля), включая знаковый бит и незначащие нули (решил, что так будет более конвенциально). Возможно, в итоге вышло не слишком красиво, а где-то даже и избыточно, но, на мой взгляд, функционально.
BitPresentation.java
public class BitPresentation {
private static int number = -2_147_483_647;
public static void main(String[] args) {
int absoluteNumberCopy = Math.abs(number);
int bitCapacity = 2;
byte numberOfInvolvedBits = 1;
while (absoluteNumberCopy >= bitCapacity) {
numberOfInvolvedBits++;
if (absoluteNumberCopy == bitCapacity || numberOfInvolvedBits == 31)
break;
bitCapacity <<= 1;
}
byte numberOfBits = (byte) (Math.pow(2, 3) - 1);
while (numberOfBits < numberOfInvolvedBits)
numberOfBits = (byte) ((++numberOfBits + 8) - 1);
long bitModule = (long) Math.pow(2, 31);
while (bitModule > absoluteNumberCopy)
bitModule >>= 1;
byte countOfBitsRead = 1;
System.out.printf("The number %,d in bit presentation: " + (number >= 0 ? 0 : 1) + " ", number);
while (bitModule > 0 || number == 0) {
while (numberOfBits - numberOfInvolvedBits > 0) {
countOfBitsRead = checkByteSpace(countOfBitsRead);
if (number >= 0)
System.out.print("0");
else
System.out.print("1");
countOfBitsRead++;
numberOfInvolvedBits++;
}
countOfBitsRead = checkByteSpace(countOfBitsRead);
if (number < 0 && absoluteNumberCopy == bitModule)
System.out.print("1");
else {
if (number > 0 || (number < 0 && absoluteNumberCopy == 0))
System.out.print(absoluteNumberCopy / bitModule > 0 ? 1 : 0);
else if (number < 0)
System.out.print(absoluteNumberCopy / bitModule == 0 ? 1 : 0);
else {
System.out.print("0");
break;
}
}
countOfBitsRead++;
absoluteNumberCopy %= bitModule;
bitModule >>= 1;
}
}
private static byte checkByteSpace(byte numberOfBits) {
if (numberOfBits == 8) {
System.out.print(" ");
return 0;
}
else
return numberOfBits;
}
}
Консольный вывод:
The number -2 147 483 647 in bit presentation: 1 0000000 00000000 00000000 00000001
Если строго по условиям задачи, то можно так:
import java.util.Scanner;
public class Task07 {
public static void main(String[] args) {
//вывести битовое представелние int числа,
// использовав 1 цикл, управляющую переменную
//вывод на консоль и битовые операции
Scanner sc = new Scanner(System.in);
System.out.print("Enter number: ");
int a = sc.nextInt();
System.out.println(Integer.toBinaryString(a));
showBinary(a);
}
public static void showBinary(int num) {
for (int i = 31; i >= 0; i--) {
int bit = num>>i & 1;
System.out.print(bit);
}
}
}