Десятично-двоичное преобразование

Я хочу преобразовать десятичные числа в двоичные числа. Я хочу сохранить их в массиве. Сначала мне нужно создать массив определенной длины, чтобы я мог хранить двоичные числа. После этого я выполняю преобразование, вот как я это делаю:

public class Aufg3 {
    public static void main(String[] args) {
        int[] test = decToBin(12, getBinArray(12));
        for(int i = 0; i < test.length; i++){
            System.out.println(test[i]);
        }
    }

    public static int[] getBinArray(int number){
        int res = number, length = 0;
        while(res != 0){        
            res /= 2;
                    length++;
        }
        return new int[length];
    }

    public static int[] decToBin(int number, int[] array){
        int res = number, k = array.length-1;
        while(res != 0){
            if(res%2 == 0){
                array[k] = 0;
            }else{
                array[k] = 1;
            }
            k--;
            res /= 2;
        }
        return array;
    }
}

Есть что улучшить? Он должен напечатать 1100 для ввода 12.


person Upvote    schedule 11.11.2010    source источник
comment
Это домашнее задание? Если это так, вы должны пометить его как таковой.   -  person Jim Garrison    schedule 11.11.2010
comment
@Jim: Тег домашнего задания... теперь не рекомендуется, но, @ArtWorkAD, пожалуйста (как всегда) следите за общие рекомендации: укажите любые особые ограничения, покажите, что вы пробовали до сих пор, и спросите, что именно сбивает с толку. ты.   -  person    schedule 12.11.2010


Ответы (4)


Я предполагаю, что вы хотите написать свой собственный код, в противном случае это легко сделать с помощью методов из стандартной библиотеки Java.

Несколько быстрых комментариев:

  • Вы можете избавиться от res временных переменных. Работайте напрямую с number (помните, что Java передает параметры по значению).
  • Сдвиг более эффективен, чем деление (number >>>= 1 вместо number /= 2), хотя компилятор все равно должен оптимизировать это.
  • Вы можете избежать модуля в decToBin, если просто сделаете array[k] = number & 1;
  • Пока вы этим занимаетесь, почему бы не позвонить getBinArray из decToBin напрямую? Затем вы можете вызвать decToBin только с одним аргументом — значением для преобразования.

Вот немного оптимизированная версия вашего кода:

public static int[] getBinArray(int number) {
    int length = 0;
    while (number != 0) {
        number >>>= 1;
        length++;
    }
    return new int[length];
}

public static int[] decToBin(int number) {
    int[] array = getBinArray(number);
    int k = array.length-1;
    while (number != 0)
    {
        array[k--] = number & 1;
        number >>>= 1;
    }
    return array;
}
person Grodriguez    schedule 11.11.2010
comment
не могли бы вы описать оператора смены, пожалуйста - person Upvote; 12.11.2010
comment
@ArtWorkAD: оператор логического сдвига >>> сдвигает все биты в операнде вправо на указанное количество позиций, вставляя столько нулевых битов, сколько необходимо для заполнения вакантных позиций слева. Таким образом, number >>>= 1 сдвигает все биты на одну позицию вправо, вставляя один нулевой бит в качестве старшего разряда. См.: en.wikipedia.org/wiki/Logical_shift. - person Grodriguez; 12.11.2010
comment
спасибо, а что вы имеете в виду под array[k--] = number & 1? что за? ? - person Upvote; 12.11.2010
comment
@ArtWorkAD: обратите внимание, что здесь используется логический сдвиг (>>>) вместо арифметического сдвига (>>). Арифметический сдвиг сохранит бит знака, поэтому вы никогда не достигнете условия завершения цикла (number, достигающего нуля). - person Grodriguez; 12.11.2010
comment
@ArtWorkAD: это не ?, а &. Это побитовый оператор И. Выражение number & 1 сохраняет только младший бит number. Это будет 1, если число нечетное, и 0, если оно четное. - person Grodriguez; 12.11.2010

Почему бы просто не использовать toBinaryString метод класса Integer:

System.out.println(Integer.toBinaryString(12))
person codaddict    schedule 11.11.2010
comment
Я не знал о таком методе. Это лучше, чем мое предложение. - person nojo; 11.11.2010

Если это не домашнее задание, не нужно делать это самостоятельно. Следующий код должен работать:

BigInteger bigInt = new BigInteger(number);
String asString = bigInt.toString(2);

Могут быть более эффективные способы, но это, безусловно, очень удобно для чтения и сопровождения.

person nojo    schedule 11.11.2010

Есть несколько мелочей, которые вы можете улучшить:

  • Вы должны определить метод «высокого уровня», который преобразует int в int[]. В текущем коде вы должны упомянуть 12 два раза, что плохо.
  • Вы должны использовать цикл do { ... } while (number != 0). В противном случае число 0 будет представлено пустым массивом.
  • Вы должны использовать x >>> 1 вместо x / 2, так как это правильно обрабатывает отрицательные числа.
  • Если вы хотите проверить правильность своего кода, напишите другой метод, который преобразует обратно из двоичного в int. Затем вы можете проверить, что binToDec(decToBin(12, ...)) == 12.
  • Метод getBinArray не должен быть public, так как это только вспомогательный метод. Вы можете либо заменить public на private, либо просто удалить public.
person Roland Illig    schedule 11.11.2010