Десятичное-двоичное преобразование - PullRequest
4 голосов
/ 11 ноября 2010

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

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.

Ответы [ 4 ]

6 голосов
/ 11 ноября 2010

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

System.out.println(Integer.toBinaryString(12))
3 голосов
/ 11 ноября 2010

Я предполагаю, что вы хотите написать свой собственный код - в противном случае это просто сделать, используя методы из стандартной библиотеки 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;
}
2 голосов
/ 11 ноября 2010

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

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

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

1 голос
/ 11 ноября 2010

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

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