2017-11-02 4 views
1

Ich versuche, zwei DNumber-Objekte in der Methode add (DNumber b) hinzuzufügen. Der Punkt ist, binäre Arithmetik ausführen zu können. Die Elemente werden normal gespeichert. Wie sollte ich mit ArrayLists umgehen, die nicht gerade sind? Füllen Sie den einen mit weniger Elementen mit 0s ?. Wie soll ich dann jedes Element abrufen? Auch was wäre eine gute Möglichkeit, in Dezimal konvertieren, ohne die Konvertierung in Dezimal-Methode:Hinzufügen von zwei Array-Objekten

public class DNumber{ 
    ArrayList<Digit> binary = new ArrayList<Digit>(); 
    /** 
    * Constructor for objects of class DNumber 
    */ 
    public DNumber() 
    { 
     Digit num = new Digit(0); 
     binary.add(num); 
    } 

    public DNumber(int val){ 
     int num = val; 
     if(num > 0){ 
      while (num > 0){ 
       Digit bin = new Digit(num%2); 
       num /= 2; 
       binary.add(0, bin); 
      } 
     } 
     else{ 
      Digit bin = new Digit(0); 
      binary.add(0,bin); 
     } 
    } 

    /** 
    * An example of a method - replace this comment with your own 
    * 
    * @param y a sample parameter for a method 
    * @return the sum of x and y 
    */ 
    public String toString(){ 
     String s = ""; 
     for(Digit d : binary){ 
      s = s + d.toString(); 
     } 
     return s; 
    } 

    public void add(DNumber b){ 
     int ArraySize1 = binary.size() -1; 
     int ArraySize2 = b.binary.size() -1; 


    } 

    public void toDecimal(){ 
     /** 
     * 
     * String s = ""; 
     int result = 0; 
     int power = 0; 
     for(Digit d : binary){ 
     s = s + d.toString(); 
     result = Integer.parseInt(s); 
     } 
     */ 
    } 
} 

public class Digit { 
    int x = 0; 

    /** 
    * Constructor for objects of class Digit 
    */ 
    public Digit(int val) { 
     if (val != 0 && val != 1) { 
      System.out.println("Error Must be either 1 or 0"); 
      x = 0; 
     } else { 
      x = val; 
     } 
    } 

    /** 
    * An example of a method - replace this comment with your own 
    * 
    * @param y a sample parameter for a method 
    * @return the sum of x and y 
    */ 
    public int getValue() { 
     return x; 
    } 

    public void setValue(int num) { 
     if (num != 0 && num != 1) { 
      System.out.println("Error Must be either 1 or 0"); 
      System.out.println("Old Value Retained"); 
     } else { 
      x = num; 
     } 
    } 

    public String toString() { 
     return Integer.toString(x); 
    } 

    public Digit add(Digit b) { 
     int returnInt = getValue() + b.getValue(); 
     Digit carry = new Digit(0); 
     if (returnInt == 2) { 
      carry = new Digit(1); 
      setValue(0); 
     } else if (returnInt == 1) { 
      carry = new Digit(0); 
      setValue(1); 
     } else if (returnInt == 0) { 
      carry = new Digit(0); 
      setValue(0); 
     } 
     return carry; 
    } 

    public Digit add(Digit b, Digit c) { 
     int returnInt = getValue() + b.getValue() + c.getValue(); 
     Digit carry = new Digit(0); 
     if (returnInt == 2) { 
      carry = new Digit(1); 
      setValue(0); 
     } else if (returnInt == 1) { 
      carry = new Digit(0); 
      setValue(1); 
     } else if (returnInt == 0) { 
      carry = new Digit(0); 
      setValue(0); 
     } else if (returnInt == 3) { 
      carry = new Digit(1); 
      setValue(1); 
     } 
     return carry; 
    } 
} 
+0

Es ist nicht unbedingt ist eine schlechte Sache, eine Digit-Klasse zu haben, um die 1s und 0s zu erzwingen, aber eine Add-Methode für die Digit-Klasse zu haben, macht keinen großen Sinn, da man nicht wirklich mit dem Übertrags-Bit umgehen kann. Ich würde mich darauf konzentrieren, nur auf der DNumber-Ebene zu addieren und das 0. Element zu machen, das 0 Bit wird wahrscheinlich die Dinge einfacher machen. – JimW

Antwort

0

Betrachten Sie diese kleine Änderung an Ihrem Konstruktor.

while (num > 0){ 
    Digit bin = new Digit(num%2); 
    num /= 2; 
    binary.add(bin); 
} 

Dies mag auf den ersten seltsam erscheinen, neue DNumber (6) erhalten Sie eine Liste (0,1,1), die nach hinten scheint, aber es ist viel einfacher, mit zu arbeiten.

Sie können diese in eine Dezimalzahl leicht umwandeln:

public int toDecimal() { 
     int total = 0; 
     int power = 1; 
     for (int i = 0; i < binary.size(); i++) { 
      total += binary.get(i).getValue() * power; 
      power *= 2; 
     } 
     return total; 
    } 

Wenn es um das Hinzufügen Sie an dem 0-ten Elemente mit einem Übertrag von 0 beginnen, wenn ein Array länger ist als der andere, es ist viel einfacher zu handhaben .

Erwägen 6 und 4

Zugabe
carry = 0 
a = (0,1,1) 
b = (0,0,1) 
answer =() 

am Anfang, es ist 0 + 0 + 0 = 0, tragen 0

carry=0 
a = (1,1) 
b = (0,1) 
answer = (0) 

die nächste Iteration, es 0 ist + 1 + 0 = 1, 0 tragen

carry=0 
a = (1) 
b = (1) 
answer = (0,1) 

die nächste Iteration, es ist 0 + 1 + 1 = 0, 1 tragen

carry=1 
a =() 
b =() 
answer = (0,1,0) 

Die nächste Iteration beide Eingabelisten leer sind, also fügen wir nur das Übertragsbit

Antwort = (0,1,0,1), die, wenn Sie durch ToDecimal laufen 10

+0

Ausgezeichnet, danke für die Hilfe –