Bergervei/Java-Dualzahlen

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Java</language>
== Umwandlung einer dezimalen Gleitkommazahl in eine Dualzahl ==

Die nachfolgende Abbildung demonstriert die Algorithmen für die Umwandlung des ganzzahligen bzw. gebrochenen Anteils der Dezimalzahl in den jeweiligen Anteil der Dualzahl:

<blockquote>[[Bild: DezimalToDual1.gif]]</blockquote>

Dualzahlen mit Nachkommastellen sowie ihre ganzzahligen und gebrochenen Anteile werden als Zeichenketten (''Strings'') repräsentiert.

<code id="4d34bbf7aee20">
private double Frac(double x) {
 return x-(int)x;
}

private String GanzToDual(double Zahl) {
 String DualString = new String();
 String TeilString = new String(); 
 int Rest;
 int GanzZahl = (int)Zahl;
 while (GanzZahl > 0) {
  Rest = GanzZahl%2;
  GanzZahl = GanzZahl/2;  
  DualString = TeilString.valueOf(Rest)+DualString;
 }
 if (DualString.length() == 0) DualString = "0";
 return DualString;
}

private String GebrToDual(double Zahl) {
 String DualString = new String();
 String TeilString = new String(); 
 int Zaehler = 0;
 double GebrZahl = Frac(Zahl);
 while (GebrZahl > 0 && Zaehler < 32) { 
  GebrZahl = GebrZahl*2;
  DualString = DualString+TeilString.valueOf((int)GebrZahl);
  GebrZahl = Frac(GebrZahl);
  Zaehler++;
 }
 return DualString;
}

public String DezimalToDual(double Zahl) {
 if (Frac(Zahl) == 0)
  return GanzToDual(Zahl);
 else
  return GanzToDual(Zahl)+"."+GebrToDual(Zahl);
}
</code>

<run id="4d34bbf7af06f">
System.out.println(DezimalToDual(12.625));
</run>

== Umwandlung einer Dualzahl in eine dezimale Gleitkommazahl ==

In ähnlicher Weise können auch Dualzahlen mit Nachkommastellen, die ebenfalls als Zeichenketten vorliegen, in Dezimalzahlen konvertiert werden. Das nachfolgende Schema verdeutlicht wieder die entsprechenden Algorithmen:

<blockquote>[[Bild: DualToDezimal1.gif]]</blockquote>

<code id="4d34bbf7aeeb4">
import java.util.regex.*;

private boolean Korrekt(String DualString) {
 Pattern P1 = Pattern.compile("[01]+");
 Pattern P2 = Pattern.compile("[01]+[.][01]+");
 Matcher M1 = P1.matcher(DualString);
 Matcher M2 = P2.matcher(DualString);
 return (M1.matches() || M2.matches());
}

private String GanzZerlegen(String DualString) {
 String TeilString = new String();
 if (Korrekt(DualString)) {
  TeilString = DualString;
  int Pos = DualString.indexOf(".");
  if (Pos > 0) TeilString = DualString.substring(0, Pos);
 } 
 return TeilString;
}

private String GebrZerlegen(String DualString) {
 String TeilString = new String();
 if (Korrekt(DualString)) {
  int Pos = DualString.indexOf(".");
  if (Pos > 0) TeilString = DualString.substring(Pos+1, DualString.length());
 } 
 return TeilString;
}

public double DualToDezimal(String DualString) {
 String GanzDual = new String(GanzZerlegen(DualString)); 
 String GebrDual = new String(GebrZerlegen(DualString));
 double Summe1 = 0; int Laenge1 = GanzDual.length();
 double Summe2 = 0; int Laenge2 = GebrDual.length();
 double Potenz = 1;
 for (int i = Laenge1; i > 0; i--) {
  Summe1 = Summe1+Potenz*Integer.parseInt(GanzDual.substring(i-1, i));
  Potenz = Potenz*2;
 } 
 double Potenz = 1;
 for (int i = 0; i < Laenge2; i++) {
  Potenz = Potenz/2;
  Summe2 = Summe2+Potenz*Integer.parseInt(GebrDual.substring(i, i+1));
 } 
 return Summe1+Summe2;
}
</code>

<run id="4d34bbf7af0d5">
System.out.println(DualToDezimal("1100.101"));
</run>