2016-10-18 3 views
0

Недавно я написал метод, который должен переворачивать биты двоичной строки. Флип появляется только в том случае, если MSB (AKA - первый символ в строке) равен 1. По какой-то причине мой код не переворачивает биты по назначению. Любая помощь приветствуется, спасибо! binary and noMSB оба являются private String.Flipping Bits In A String

public int binaryToDecimalAssumingOnesComp() { 
    if (binary.charAt(0) == '0') { 
     convertedToDecimal = Integer.parseInt(binary, 2); 
    } else if (binary.charAt(0) == '1') { 
     noMSB = binary.substring(1); 
     for (int i = 0; i < noMSB.length(); i++) { 
      if (noMSB.charAt(i) == '1') { 
       noMSB.replace(noMSB.charAt(i), '0'); 
      } 
      else if (noMSB.charAt(i) == '0') { 
       noMSB.replace(noMSB.charAt(i), '1'); 
      } 
      convertedToDecimal = Integer.parseInt(noMSB, 2); 
     } 
    } 
    return convertedToDecimal; 
} 
+0

«мой код не переворачивая биты, как предназначенный «<- What * is * it doing?» Например, что такое вход (значение «двоичный»), каков ожидаемый результат и что ваш код ошибочно возвращается? – smarx

+0

My bad. Его вывод из обычного двоичного преобразования. Например, если вводится '1000000001', выход -' -1', но он должен быть '-511'. Потому что мы переворачиваем каждый бит, но MSB. Таким образом, ожидаемый двоичный код будет« 1111111110 », а затем преобразован в десятичный '-511' – JavaGuy1

ответ

1

Несколько вопросов:

  1. noMSB.replace(noMSB.charAt(i), '0'); не то, что вы хотите. Прежде всего, это заменит все0 s в строке с 1 s, а не только с той, над которой вы работаете. Во-вторых, это фактически не изменяет строку. Он создает новый с заменой и возвращает его, но вы игнорируете возвращаемое значение. Так эффективно это ничего не делает. В общем, строки в Java неизменяемы (не могут быть изменены). Вам нужно либо создать новую строку каждый раз, когда вы хотите внести изменения, либо использовать что-то вроде StringBuilder, которое предназначено для этой цели.
  2. Вы анализируете целое число на каждой итерации цикла for, но это необязательно. (Нет никакого реального вреда, просто бесполезная работа.)
  3. Чтобы избежать глобального состояния, я сделал это статическим методом и передал в binary. (Это не правильность проблемы с кодом, только что сделали это легче работать с.)

Вот фиксированная версия коды:

public static int binaryToDecimalAssumingOnesComp(String binary) { 
    if (binary.charAt(0) == '0') { 
     return Integer.parseInt(binary, 2); 
    } else { 
     StringBuilder noMSB = new StringBuilder(binary.substring(1)); 
     for (int i = 0; i < noMSB.length(); i++) { 
      if (noMSB.charAt(i) == '1') { 
       noMSB.setCharAt(i, '0'); 
      } 
      else if (noMSB.charAt(i) == '0') { 
       noMSB.setCharAt(i, '1'); 
      } 
     } 
     return Integer.parseInt(noMSB.toString(), 2); 
    } 
} 
0

Я изменил код, чтобы выполнить требуемую операцию. Пожалуйста, посмотрите ..

class Main { 
    public static void main(String[] args) { 
    String s = "0010"; 
    System.out.println(binaryToDecimalAssumingOnesComp(s)); 
    } 
    public static int binaryToDecimalAssumingOnesComp(String binary) { 
    int convertedToDecimal=0; 
    if (binary.charAt(0) == '0') { 
     convertedToDecimal = Integer.parseInt(binary, 2); 
    } else if (binary.charAt(0) == '1') { 
     StringBuilder noMSB = new StringBuilder(binary.substring(1)); 
     for (int i = 0; i < noMSB.length(); i++) { 
      if (noMSB.charAt(i) == '1') { 
       noMSB.setCharAt(i,'0'); 
      } 
      else if (noMSB.charAt(i) == '0') { 
       noMSB.setCharAt(i,'1'); 
      } 
     } 
     String s = noMSB.toString(); 
     convertedToDecimal = Integer.parseInt(s, 2); 
    } 
    return convertedToDecimal; 
} 
} 

Примечание: Строки неизменны, поэтому я использовал StringBuilder вместо этого. Для else случае вы превращали в десятичную внутри for цикла, что является неправильным

+0

Что как это делает 'StringBuilder'? – JavaGuy1

+0

StringBuilder позволяет вам изменять строку. –