2010-11-11 3 views
4

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

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

+1

Это домашнее задание? Если это так, вы должны пометить его как таковой. –

+0

@Jim: [«Домашний тег ... теперь обескуражен») (http://meta.stackoverflow.com/q/10812), но, @ArtWorkAD, пожалуйста (как всегда) следуйте [общим рекомендациям] (http : //tinyurl.com/so-hints): укажите какие-либо специальные ограничения, покажите, что вы пробовали до сих пор, и спросите, что конкретно вас путает. – 2010-11-12 14:09:48

ответ

3

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

Вы можете описать оператора сдвига, пожалуйста, –

+2

@ArtWorkAD: Оператор логического сдвига '>>>' сдвигает все биты в операнде вправо на указанное количество позиций, вставляя столько нулевых бит, сколько необходимо, чтобы заполнить свободные позиции в левый. Таким образом, 'number >>> = 1' сдвигает все биты на одну позицию вправо, вставляя один нулевой бит в качестве MSB. Смотрите: http://en.wikipedia.org/wiki/Logical_shift – Grodriguez

+0

спасибо, а что вы имеете в виду с массивом [k--] = number & 1? Что такое «?» ? –

6

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

System.out.println(Integer.toBinaryString(12)) 
+2

Я не знал об этом методе. Это лучше, чем мое предложение. – nojo

2

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

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

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

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^