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:
Und hier mein "übersetzter" Java Code
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: