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 шт):

Автор решения: Barmaley

Например так:

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;
        }
    }
}
→ Ссылка
Автор решения: Bakuard

Возможно более аккуратный и простой вариант. Он выводит и не значащие нули:

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

→ Ссылка
Автор решения: Anturza

Если строго по условиям задачи, то можно так:

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);
        }
    }
}
→ Ссылка