Java Print Binary Number с использованием битового оператора [закрыто

StackOverflow https://stackoverflow.com/questions/2784133

Вопрос

Привет, я создаю метод, который возьмет номер и распечатает его вместе с его двоичным представлением. Проблемы в том, что мой метод печатает все 0 для любого положительного числа, и все 1 для любого отрицательного числа

private static void display( int number ){

        System.out.print(number + "\t");        
        int mask = 1 << 31;

        for(int i=1; i<=32; i++) {
            if( (mask & number) != 0 )
                System.out.print(1);
            else
                System.out.print(0);


            if( (i % 4) == 0 )
                System.out.print(" ");

        }

    }

Я получил это: это работает:

/**
     * prints the 32-bit binary representation of a number
     * @param number the number to print
     */
    private static void display( int number ){
        //display number and a tab
        System.out.print(number + "\t");

        //shift number 31 bits left
        int mask = 1 << 31;

        //loop and print either 1 or 0
        for(int i=31; i>=0; i--) {
            if( ((1 << i)&number) != 0)
                System.out.print(1);
            else
                System.out.print(0);

            //every four bits print a space
            if( (i % 4) == 0 )
                System.out.print(" ");            

        }
        //print new line
        System.out.println();
    }
Это было полезно?

Решение

Вы забыли обновить маску:

    for(int i=1; i<=32; i++) {
        if( (mask & number) != 0 )
            System.out.print(1);
        else
            System.out.print(0);


        if( (i % 4) == 0 )
            System.out.print(" ");

        mask = mask >> 1;
    }

Другие советы

Текст вопроса был отредактирован много раз, поэтому трудно сказать, что такое вопрос, но вот некоторые замечания.

На подписанных против сдвига без знака

Одно пересмотр вопроса содержит эту строку:

int mask = 1 << 31;

Один ответ предлагает, что то, что было пропущено, это эта линия:

mask = mask >> 1;

Это на самом деле не будет работать, потому что >> это подписанный сдвиг, и приведет к неправильному mask Значение для этой цели (так как опустошенные биты заполнены 1s). Любое отрицательное число будет преобразовано в 32 бита, все 1.

Тременная необходима, это не подписированная правая смена.

mask >>>= 1;

Обратите внимание, что составное назначение использовалось для краткости. Беззначный правый сдвиг >>> заполняет опорожняет биты с 0. Отказ Как здесь используется, это гарантирует, что mask Всегда будет иметь только один битовый набор, который является то, что требуется для этой проблемы.

Смотрите также

Подобный вопрос


Альтернативное решение

На самом деле есть более простое решение для преобразования 32-битного int на 32 бита, разделенные на группы по 4 битам.

static String zeroes(int length) {
    return (length <= 0) ? ""
      : String.format("%0" + length + "d", 0);
}
//...

int num = 8675309;

// convert to binary
String s = Integer.toBinaryString(num);
System.out.println(s);
// prints "100001000101111111101101"

// fill in leading zeroes
s = zeroes(Integer.SIZE - s.length()) + s;
System.out.println(s);
// prints "00000000100001000101111111101101"

s = s.replaceAll("(?!$)(?<=\\G.{4})", " ");
System.out.println("[" + s + "]");
// prints "[0000 0000 1000 0100 0101 1111 1110 1101]"

Даже если это домашнее задание, разные методы, используемые здесь, все равно должны быть обучающимися.

Смотрите также

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top