Binäraddition

Lukases2

Aktives Mitglied
Ich möchte zwei binäre Zahlen der selben Länge addieren und habe dazu das hier geschrieben:
Java:
public boolean[] add(boolean[] dest, boolean[] src){
		boolean uebertrag = false;
		for(int i=dest.length; i==0; i--){
			if(dest[i]==false && src[i]==false){
				if(uebertrag==false){
					dest[i]=false;
					uebertrag=false;
				}
				if(uebertrag==true){
					dest[i]=true;
					uebertrag=false;
				}
			}
			
			if(dest[i]==false && src[i]==true){
				if(uebertrag==false){
					dest[i]=true;
					uebertrag=false;
				}
				if(uebertrag==true){
					dest[i]=false;
					uebertrag=true;
				}
			}
			
			if(dest[i]==true && src[i]==false){
				if(uebertrag==false){
					dest[i]=true;
					uebertrag=false;
				}
				if(uebertrag==true){
					dest[i]=false;
					uebertrag=true;
				}
			}
			
			if(dest[i]==true && src[i]==true){
				if(uebertrag==false){
					dest[i]=false;
					uebertrag=true;
				}
				if(uebertrag==true){
					dest[i]=true;
					uebertrag=true;
				}
			}
		}
		return dest; // das Ergebnis soll am Ende in dest stehen; eine Umwandlung in Binärzahlen soll vor Berechnung nicht stattfinden
	}
Es kommen leider nicht die richtigen Ergebnisse raus. Wo liegt mein Fehler?
 

AntiMuffin

Bekanntes Mitglied
Hallo,
du hast nur einen kleinen Fehler und zwar deine Schleife ist falsch deklariert!
Es müsste heißen:
Java:
for(int i=dest.length-1; i>=0; i--)

Gruß,
AntiMuffin
 

njans

Top Contributor
Du kannst das ganze so viel einfacher machen:
Einfach die beiden Werte XOR nehmen, dann hast du den neuen Wert.
Wenn beide Werte 1 sind, dann ist der Übertrag 1.
Und generell musst du nicht prüfen, ob ein boolean true oder false ist. uebertrag z.B. ist bereits ein boolean, if (uebertrag) ist deutlich kürzer als if(uebertrag == true)
 
Zuletzt bearbeitet:

stg

Top Contributor
In der for-Schleife willst du jeweils sicher nur EINEN der VIER Fälle betrachten. Bei dir springt das Programm aber ggfls in mehrere if-Blöcke. Dafür gibts das Schlüsselwort else.
 

Lukases2

Aktives Mitglied
In der for-Schleife willst du jeweils sicher nur EINEN der VIER Fälle betrachten. Bei dir springt das Programm aber ggfls in mehrere if-Blöcke. Dafür gibts das Schlüsselwort el
Meinst du sowas?
Java:
// ...
if(dest[i]==false && src[i]==false){
				if(uebertrag==false){
					dest[i]=false;
					uebertrag=false;
				}
				else if(uebertrag==true){
					dest[i]=true;
					uebertrag=false;
				}
			}
			
			else if(dest[i]==false && src[i]==true){
				if(uebertrag==false){
					dest[i]=true;
					uebertrag=false;
				}
				else if(uebertrag==true){
					dest[i]=false;
					uebertrag=true;
				}
			}
// ...

Ich komme aber immer noch nicht auf richtige Ergebnisse. Zum Beispiel errechnet er mir 0000 + 0101 = 0000 oder 0001 + 0100 = 0001. Warum? ;(
 

AntiMuffin

Bekanntes Mitglied
Ja also ich hab die IF eingebaut und die FOR-Schleife Korrigiert.
Bei mir kommt jetzt das richtigE Ergebnis raus:
Java:
public static void main(String[] args)
	{
		
		
	    boolean[] dest = {
			false,
			false,
			false,
			true
		};
		boolean[] src = {
			false,
			true,
			false,
			false
		};
		System.out.println(booleanToString(dest));
		System.out.println(booleanToString(src));
		boolean[] erg = add(dest,src);
		System.out.println(booleanToString(dest));
		System.out.println(booleanToString(src));
		System.out.println(booleanToString(erg));
	}
	
	public static String booleanToString(boolean[] bool){
		String string = "";
		for(boolean b : bool){
			string += b ? "1" : "0";
		}
		return string;
		
	}
			

	public static boolean[] add(boolean[] dest, boolean[] src){
		boolean uebertrag = false;
		for(int i=dest.length-1; i>=0; i--){
			if(dest[i]==false && src[i]==false){
				if(uebertrag==false){
					dest[i]=false;
					uebertrag=false;
				}else
				if(uebertrag==true){
					dest[i]=true;
					uebertrag=false;
				}
			}else

			if(dest[i]==false && src[i]==true){
				if(uebertrag==false){
					dest[i]=true;
					uebertrag=false;
				}else
				if(uebertrag==true){
					dest[i]=false;
					uebertrag=true;
				}
			}else

			if(dest[i]==true && src[i]==false){
				if(uebertrag==false){
					dest[i]=true;
					uebertrag=false;
				}else
				if(uebertrag==true){
					dest[i]=false;
					uebertrag=true;
				}
			}else

			if(dest[i]==true && src[i]==true){
				if(uebertrag==false){
					dest[i]=false;
					uebertrag=true;
				}else
				if(uebertrag==true){
					dest[i]=true;
					uebertrag=true;
				}
			}
		}
		return dest; // das Ergebnis soll am Ende in dest stehen; eine Umwandlung in Binärzahlen soll vor Berechnung nicht stattfinden
	}
 

Oben