Удалить ведущие нули из двоичного преобразования - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь преобразовать любое число до 2 ^ 32 - 1, введенное пользователем, в его двоичное значение, используя только побитовые операторы. После долгих царапин и ошибок я пришел к такому выводу, что, похоже, дает мне то, что я хочу ... почти:

public static void main(String[] args) {

  Scanner scan = new Scanner(System.in);

  System.out.print("Enter a number: ");
  String input = scan.nextLine();

  int dec = Integer.parseInt(input);

  ArrayList<Integer> binary = new ArrayList<Integer>();

  for (int i = 0; i < 32; i++) {
     if ((dec & 1) == 0) {
        binary.add(0);
     } else {
        binary.add(1);
     }
     dec = dec >>> 1;
  }

  Object[] binaryArray = binary.toArray();

  for (int i = binaryArray.length - 1; i >= 0; i--) {
     System.out.print(binaryArray[i]);
  }

}

Вот моя проблема сейчас: это выводит правильную двоичную строку, но мне нужно удалить начальные нули, чтобы десятичное число 10 в двоичном виде представляло собой 1010, а не 00000000000000000000000000001010.

Я учусь на первом семестре в CS, поэтому любая помощь по решению проблемы или советы по уборке код будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Читая твой код в третий раз, я заметил кое-что немного хитрое. То, что вы делаете, в порядке, но может быть и лучший способ. Я не собираюсь давать ответ, но я хочу взглянуть на что-то другое.

ArrayList в вашем коде не требуется. Что, если вы написали код таким образом?

  for (int i = 1 << 31; i != 0; i = i >>> 1) {
     if ((dec & i) == 0) {
        System.out.print( "0" );  //binary.add(0);
     } else {
        System.out.print( "1" );  //binary.add(1);
     }
  }

Здесь я просто "печатать как я go". ArrayList и преобразование в массив не требуется. У меня уже есть один l oop, работающий, и мне не нужно добавлять второй l oop для печати всех значений массива, потому что я просто использую l oop, который у меня уже есть.

ОК, поэтому первый фрагмент кода, который у меня был, был неправильным. Он печатает в обратном порядке. Этот код (должен! Не проверен!) Начинается с бита # 32 и отсчитывает вниз , печатая биты по порядку. Он также показывает, как вы можете использовать другие вещи в for l oop, например i = i >>> 1, вместо того, чтобы просто всегда делать ++.

Разработка подсказки: быстрый способ «увидеть» то, что вы делаете в коде - это печатать важные значения во время работы вашего кода. Например, чтобы понять, что вы можете сделать с dec, добавьте оператор print, чтобы вывести его значение. Некоторые говорят, что нужно использовать отладчик и проходить через код, но я считаю, что операторы печати быстрее.

     for( int i = 0; i < 32 ; i++ ) {
        if( (dec & 1) == 0 ) {
           binary.add( 0 );
        } else {
           binary.add( 1 );
        }
        dec = dec >>> 1;
        System.out.println( "DEBUG: " + dec );
     }
0 голосов
/ 24 марта 2020

Исходя из моего понимания вашего вопроса, вот что я могу придумать.

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

  public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    System.out.print("Enter a number: ");
    String input = scan.nextLine();

    int dec = Integer.parseInt(input);
    ArrayList<Integer> binary = new ArrayList<>();
    for (int i = 0; i < 32; i++) {
        if ((dec & 1) == 0) {
            binary.add(0);
        } else {
            binary.add(1);
        }
        dec = dec >>> 1;
    }
    StringBuilder ss = new StringBuilder();
    for (int i = binary.size() - 1; i >= 0; i--) {
        ss.append(binary.get(i));
    }
    System.out.println(Integer.parseInt(ss.toString()));
  }

Или вы можете использовать этот подход меньшие коды :) легко читается

  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("Enter a number: ");
    String input = scan.nextLine();
    int dec = Integer.parseInt(input);
    char[] arr = Integer.toBinaryString(dec).toCharArray();
    StringBuilder sb = new StringBuilder();
    for (Character c : arr) {
        sb.append(c);
    }
    System.out.println(sb);
  }
...