Bin to Dez und umgekehrt mit sehr großen Zahlen

nilskober

Mitglied
Hallo zusammen,

ich bin neu hier im Forum.
Gerade bin ich dabei, ein Taschenrechner zu programmieren, der mit sehr großen Zahlen (also solche die über den Wertebereich von long) rausgehen zu rechnen. Aus Performance-Gründen mache ich dass alles mit Binär-Zahlen. Um diese zu speichern verwende ich die Klasse BitSet. Jetzt möchte ich aber auch Dezimal-Zahlen einlesen und wieder ausgeben können, muss also eine Umwandlung Bin->Dez und Dez->Bin programmieren. Wären die Zahlen nicht so groß, wäre es ja kein Problem aber so muss ich es hinkriegen, ohne mit den Dez-Zahlen rechenn zu müssen. Also einfach Potenzen und addieren geht nicht, bzw. wäre nochmal ein großer Aufwand. Weiß jemand wie das geht? Die Dez-Zahl ist sollte als String gespeichert werden.

Ich hab bereits von dieser Website Zahlensystem-Umrechner den Javascript Code kopiert für Bin->Dez und versucht in in Java zu "übersetzen". Jedoch kommen bei mir dann immer völlig falsche Werte raus. Ich hab schon den halben Tag Foren und Google durchsucht und werde nicht wirklich schlau draus. Wäre echt nett wenn mir jemand helfen könnte.

LG
Nils

Hier der Javascript Code:
Code:
function binToDez(bin){
  var len = bin.length;
  var decoutput = String();
  var work = new Array(len);
  var outputlen = 0;
  for(var i=0; i<len; i++){work[i] = bin[i];}
  while(len){
    // as long as a remaining value exists
    var lead = false;
    var bit0;
    var bit1;
    var bit2;
    var bit3;
    var value;
    var i = 0;
    while(i < len-3){
      // walk through the remaining value
      bit0 = work[i+3];
      bit1 = work[i+2];
      bit2 = work[i+1];
      bit3 = work[i+0];
      value = (bit3<<3) | (bit2<<2) | (bit1<<1) | (bit0<<0);
      if(value >= 10){
        // For nibbles greaterequal than 10, adjust the bits accordingly.
        work[i+0] = true; 
        work[i+1] = bit2 && bit1; 
        work[i+2] = !bit1;
      }else{
        work[i+0] = lead;
        if(lead){
          // When the previous nibble was 8 or 9, adjust the bits accordingly
          work[i+1] = !bit1; work[i+2] = !bit1;
          lead = bit1;
        }else{
          // otherwise, just leave the bits as they are.
          if(value >= 8){lead = true;}
        }
      }
      i++;
    }
    // extract the decimal value of the remaining bits
    if(len==1){
      bit0 = work[0];
      bit1 = false;
      bit2 = false;
    }else if(len==2){
      bit0 = work[1];
      bit1 = work[0];
      bit2 = false;
    }else{
      bit0 = work[i + 2];
      bit1 = work[i + 1];
      bit2 = work[i + 0];
    }
    bit3 = lead;
    var value = (bit3<<3) | (bit2<<2) | (bit1<<1) | (bit0<<0);
    decoutput = value + decoutput;
    outputlen++;
    len = i;
  }
  // Remove zeros
  var i = 0;
  outputlen = decoutput.length;
  while((i < outputlen) && ((decoutput[i] == '0'))){i++;}
  if(i == outputlen){
    return "0";
  }else{
    return decoutput.slice(i);
  }
}



Und hier mein "übersetzter" Java Code
Code:
public static String binToDez(BitSet a) {
		int len = a.length();
		String decoutput = new String();
		BitSet work = new BitSet();
		int outputlen = 0;
		for(int i=0; i<len; i++){
			if (a.get(i)) work.set(i);
		}
		while(len > 0){
			// as long as a remaining value exists
			boolean lead = false;
			int bit0 = 0;
			int bit1 = 0;
			int bit2 = 0;
			int bit3 = 0;
			int value;
			int i = 0;
			while(i < len-3){
				// walk through the remaining value
				bit0 = work.get(i+3) ? 1 : 0;
				bit1 = work.get(i+2) ? 1 : 0;
				bit2 = work.get(i+1) ? 1 : 0;
				bit3 = work.get(i) ? 1 : 0;
				
				value = (bit3<<3) | (bit2<<2) | (bit1<<1) | (bit0<<0);
				
				if(value >= 10){
					// For nibbles greaterequal than 10, adjust the bits accordingly.
					work.set(i); 
					if (bit2 > 0 && bit1 > 0) work.set(i+1);
					else work.clear(i+1);
					if (!(bit1 > 0)) work.set(i+2);
					else work.clear(i+2);
				}else{
					if (lead) work.set(i);
					if(lead){
						// When the previous nibble was 8 or 9, adjust the bits accordingly
						if (!(bit1 > 0)) work.set(i+1); 
						else work.clear(i+1);
						//really???
						if (!(bit1 > 0)) work.set(i+2);
						else work.clear(i+2);
						if (bit1 > 0) lead = true;
						else lead = false;
					}else{
						// otherwise, just leave the bits as they are.
						if(value >= 8){lead = true;}
					}
				}
				i++;
			}
			// extract the decimal value of the remaining bits
			if(len==1){
				if (work.get(0)) bit0 = 1;
				else bit0 = 0;
				bit1 = 0;
				bit2 = 0;
			}else if(len==2){
				if (work.get(1)) bit0 = 1;
				else bit0 = 0;
				if (work.get(2)) bit1 = 1;
				else bit1 = 0;
				bit2 = 0;
			}else{
				if (work.get(i+2)) bit0 = 1;
				else bit0 = 0;
				if (work.get(i+1)) bit1 = 1;
				else bit0 = 0;
				if (work.get(i)) bit2 = 1;
				else bit0 = 0;
			}
			if (lead) bit3 = 1;
			int value_01 = (bit3<<3) | (bit2<<2) | (bit1<<1) | (bit0<<0);
			
			decoutput = value_01 + decoutput;
			outputlen++;
			len = i;
			
		}
		// Remove zeros
		int i = 0;
		outputlen = decoutput.length();
		while ((i < outputlen) && ((decoutput.startsWith("0")))) i++;
		
		if(i == outputlen){
			return "0";
		}else{
			return decoutput.substring(i);
		}
	}
 
Zuletzt bearbeitet:

turtle

Top Contributor
Java:
	public static void main(String[] args) {
		BigInteger bigInteger = new BigInteger("234567893216781234567893216781234567893216781");
		String dual = bigInteger.toString(2);
		System.out.println(dual);
		//1010100001001011010100010101010110011100110101111010110111110001000100100101100110010101111111010111011010011110001100000001000001111110111000001101
	}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Byte zu String & umgekehrt Allgemeine Java-Themen 3
A Umwandlung String --> Int un umgekehrt Allgemeine Java-Themen 18
B Array umgekehrt ausgeben Allgemeine Java-Themen 6
B Sehr großen Graph mit Verbindungen bauen und minimieren? Allgemeine Java-Themen 35
javamax2000 Sehr sonderbares Verhalten Allgemeine Java-Themen 6
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
P Rechnen mit sehr kleinen Zahlen Allgemeine Java-Themen 5
R JDK installieren OpenJDK-Aufruf sehr langsam Allgemeine Java-Themen 4
Thallius String erzeugen sehr langsam Allgemeine Java-Themen 16
D Verwaltung von sehr vielen Objekten Allgemeine Java-Themen 12
S JNLP startet seit 1.8.0_31 sehr langsam + Windows-Systemverzeichnis Allgemeine Java-Themen 3
Creylon Java verursacht sehr starkes ruckeln Allgemeine Java-Themen 5
T Gleiche Operation dauert teilweise sehr lange Allgemeine Java-Themen 12
M Externe Jar sehr langsam Allgemeine Java-Themen 23
M JUnit & Multithreading - sehr seltener Fehler Allgemeine Java-Themen 3
H Sehr viele Threads effizient Verwalten Allgemeine Java-Themen 13
J Laden von JAR Files geht ohne ADMIN Rechte sehr langsam Allgemeine Java-Themen 6
H Kopieren sehr langsam Allgemeine Java-Themen 5
B Cipher.getInstance Aufruf sehr langsam Allgemeine Java-Themen 2
nrg Arbeiten mit sehr großen CSV Dateien Allgemeine Java-Themen 20
K replaceAll bei sehr großen String Allgemeine Java-Themen 3
B Eingabemaske Komponenten aktivieren, funktionert nicht (sehr kurios) Allgemeine Java-Themen 2
hdi Heap Sapce Error bei sehr großem String Allgemeine Java-Themen 5
G RXTX library braucht sehr lange zum laden. Ist das normal? Allgemeine Java-Themen 8
L Java 1.5 - Anwendung unter 1.6 JRE sehr langsam geworden Allgemeine Java-Themen 8
O Speicherverbrauch von Java / VM sehr hoch? Allgemeine Java-Themen 27
M Rechnen mit sehr kleinen Zahlen Allgemeine Java-Themen 8
G Lesen von sehr großen dateien Allgemeine Java-Themen 8
M String zusammensetzen->sehr langsam Allgemeine Java-Themen 3
G Sehr sehr merkwürdige Ereignisse mit Fibonacci Programm Allgemeine Java-Themen 6
G Sehr gutes Java-Framework(Gui-Builder) auf XML-Basis gesucht Allgemeine Java-Themen 21
E String.replace für (sehr) großen Text Allgemeine Java-Themen 9
T [SVNKit] Commit sehr langsam. Allgemeine Java-Themen 7
G Arraylist statt List - Sehr schlimm? Allgemeine Java-Themen 8
F JAVA Applikationen starten sehr langsam Allgemeine Java-Themen 14
D Datei öffnung sehr langsam Allgemeine Java-Themen 17
G Neue Warenwirtschaft aber sehr langsam! Allgemeine Java-Themen 3
H Entpacken sehr langsam Allgemeine Java-Themen 10
Bleiglanz Benchmarks sind sehr schwierig Allgemeine Java-Themen 2
T Modulo-Operator versagt bei zu großen Zahlen? Allgemeine Java-Themen 14
H Gibt es einen großen Unterschied zwischen Java 6 und Java 7? Allgemeine Java-Themen 3
R Panel mit 8 gleich großen "fenstern" Allgemeine Java-Themen 11
M Eclipse Stackoverflow beim Einlesen von großen Bilder in kd Baum Allgemeine Java-Themen 15
S Schnelles arbeiten mit großen CSV Dateien Allgemeine Java-Themen 4
H2SO3- großen double in string mit e umwandeln Allgemeine Java-Themen 4
kb22 CMS mit großen Dateien (heap problem) Allgemeine Java-Themen 3
H2SO3- speichern von Daten in seeeeeehr großen Tabellen (nicht DB) Allgemeine Java-Themen 8
G Bringt es etwas System.gc() nach großen Aufgaben aufzurufen? Allgemeine Java-Themen 2
T Suche den großen Calendar Thread ! Allgemeine Java-Themen 2
U Kompilieren einer großen Datei if-else = StackOverflowError Allgemeine Java-Themen 4
S Datenbank Abfragen mit großen Datenmengen Allgemeine Java-Themen 22
M String#equals(), Probleme mit großen Strings? Allgemeine Java-Themen 4
F Mehrere Bilder zu einem Großen zusammenkleben Allgemeine Java-Themen 3
R Was nehmen für Flußdiagramme und Druck von großen Grafiken Allgemeine Java-Themen 4
W JTextArea beschleunigen bei großen Texten Allgemeine Java-Themen 4
flashfactor Problem mit mehren großen Dateien Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben