Отсутствует 1 бит при преобразовании из десятичного в 8-битное двоичное

Я написал простой метод на Java для преобразования десятичного числа в его 8-битное двоичное представление. Однако для некоторых чисел он возвращает 7 бит вместо 8 бит, но для других чисел он работает отлично.

Я пытался понять это в течение 2 часов, и безрезультатно исследовал этот сайт. Любая помощь приветствуется. Спасибо!

public static void convertBinary(int n) {
    int[] arr = new int[8]; //initialized to hold 8 bit places
    int counter = 0;
    String binary = "";

    while(n > 0) {
        arr[counter] = n % 2;
        n /= 2;
        counter++;
    }
    for(int i = counter; i >= 0; i--) {
        binary = "" + arr[i];
        System.out.print(binary);
    }
} 

Когда я вызываю convertBinary (125), я получаю 01111101, что является правильным 8-битным представлением.

Однако, когда я называю его convertBinary (32), я получаю 0100000, в котором отсутствует 1 бит. Результат, который я хочу, - 00100000.

Я думал, что инициализация массива из 8 размеров поможет с заполнением 0 спереди, но по какой-то причине это не работает. Я здесь и снова нахожусь на грани остроумия, любая помощь приветствуется. Спасибо!

Почему бы в последнем цикле просто не распечатать все 8 бит вместо того, чтобы начинать с counter?

Kevin Anderson 25.10.2018 02:42

@KevinAnderson Мне пришлось сделать декрементированный цикл, чтобы перевернуть числа, поскольку первый цикл while дает обратный результат

Shaun Y 25.10.2018 02:48

Поскольку в вашем массиве всегда 8 элементов, почему бы не начать с 7 до 0? Нравится for (int I = 7; I >= 0; --I) {}

Ivan 25.10.2018 02:51

@Ivan Вот и все! Однако мне интересно, есть ли лучшее решение (чтобы избежать магического числа 7)

Shaun Y 25.10.2018 02:55
arr.length - 1, поскольку в Java массивы отсчитываются от нуля, индекс последнего элемента рассчитывается как длина массива минус 1.
Ivan 25.10.2018 02:55

@ Иван, спасибо, все отлично сработало. Кроме того, быстрый вопрос, поскольку я только что кое-что заметил, в моем коде я использовал i - а в вашем фрагменте вы использовали --i. это просто вопрос предпочтений или есть разница между ними?

Shaun Y 25.10.2018 02:59

Разница есть, но не имеет значения в этом конкретном контексте. Это не значит, что вы можете просто заменить --i и i-- в других контекстах, хотя ...

Kevin Anderson 25.10.2018 03:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
67
1

Ответы 1

Вы выполняете итерацию из количества бит в данном числе 32, которое имеет только 6 бит. если вам нужны все 8 бит, выполните итерацию, начиная с длины бит, равной 8.

         public static void convertBinary(int n) {
            int length = 8;
            int[] arr = new int[length]; //initialized to hold 8 bit places
            int counter = 0;
            String binary = "";

            while(n > 0) {
                arr[counter] = n % 2;
                n /= 2;
                counter++;
            }
            for(int i = length - 1; i >= 0; i--) {
                binary = "" + arr[i];
                System.out.print(binary);
            }
        } 

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