# umrechnen von dezimal in dual



## yidaki (29. Juni 2004)

Hallo zusammen!

Ich hab ein kleines Programm geschrieben zum umrechnen von dezimal in dual. Das Ergebnis kommt leider spiegelverkehrt raus.
z.B.
für die Dezimalzahl 16 kommt raus
--> 00001 anstatt
--> 10000  

Meine Frage ist nun ob es ne möglichkeit gibt ohne eine forschleife die
Ausgabe an die Richtige position zu bringen.....


```
public class Dual 
{ 
   public static void main(String[] args){ 
      int dez = 8; 
      int temp = 0; 
         while (dez > 0){ 
         temp = dez %2; //+ temp;{ 
         dez = dez/2; 
         System.out.print(temp); 
      } 
   } 
}
```


----------



## Peter Bönnen (29. Juni 2004)

Eine Möglichkeit, die sich bis auf den StringBuffer ziemlich an deinen Code hält:
	
	
	



```
public class Dual 
{ 
  public static void main(String[] args)
  { 
    int dez = 8; 
    StringBuffer temp = new StringBuffer(); 
    while (dez > 0)
    { 
      temp.insert(0, dez%2); 
      dez = dez/2; 
    } 
    System.out.print(temp);
  } 
}
```
Peter


----------



## yidaki (29. Juni 2004)

> Eine Möglichkeit, die sich bis auf den StringBuffer ziemlich an deinen Code hält:



Danke 
Werds morgen ausprobieren ;-)


----------



## squeaker (30. Juni 2004)

kann man nicht einfach bits testen? int hat doch nur 32 bit.


----------



## Thomas Darimont (30. Juni 2004)

Hallo!


```
public class BinConvertTest {

	private static final double LN2 = Math.log(2);

	public static void main(String[] args) {

		//langsam
		long time = -System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			dez2dual2(i);
			//System.out.println(dez2dual2(i));
		}
		System.out.println("msec: " + (time + System.currentTimeMillis()));

		//schnell
		time = -System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			dez2dual(i);
			//System.out.println(dez2dual(i));
			
		}
		System.out.println("msec: " + (time + System.currentTimeMillis()));

		//Noch schneller
		time = -System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			Integer.toBinaryString(i);
			//System.out.println(Integer.toBinaryString(i));
		}
		System.out.println("msec: " + (time + System.currentTimeMillis()));
	}

	private static String dez2dual2(int i) {
		StringBuffer sb = new StringBuffer(i);

		while (i > 0) {
			sb.insert(0,i%2);
			i /= 2;
		}

		return sb.toString();
	}

	/**
	 * @param i
	 * @return
	 */
	private static String dez2dual(int i) {

		if (i == 0)
			return "0";
		if (i == 1)
			return "1";

		int arraySize = (int) (Math.log(i) / LN2) + 1;

		if (i % 2 == 0) {
			char[] cA = new char[arraySize];
			cA[cA.length - 1] = '1';
			return new String(cA);
		}

		char[] cA = new char[arraySize];

		int j = cA.length;
		while (i > 0) {
			cA[--j] = (char) (48 + (i % 2));
			i /= 2;
		}

		return new String(cA);
	}
}
```

Ausgabe:


> msec: 547
> msec: 31
> msec: 16



... was lernen wir daraus? String Erzeugungen sind teuer UND "verschwende keine Zeit dir optimierte Versionen für Standardalgorithmen auszudenken, die eh alle schon bestens in der JVM integriert sind (das gilt z.Bsp auch für mathematische Operationen wie Math.sqrt(double d)..."

Gruß Tom


----------



## squeaker (30. Juni 2004)

> _Original geschrieben von Thomas Darimont _
> *... was lernen wir daraus? String Erzeugungen sind teuer UND "verschwende keine Zeit dir optimierte Versionen für Standardalgorithmen auszudenken, die eh alle schon bestens in der JVM integriert sind (das gilt z.Bsp auch für mathematische Operationen wie Math.sqrt(double d)..."
> *


immer diese Neunmalklugen API-Dokumentations-Leser


----------



## Thomas Darimont (30. Juni 2004)

... das steht so Gott sei Dank nicht in der (holy) API ;-)

Gruß Tom


----------



## yidaki (4. Juli 2004)

also ich bin im moment mit was anderem beschäftigt und habs doch noch hinbekommen....

naja aber ich werde mir den code auf jeden fall sobald ich zeit nochmal angucken!

thx 

gruß


----------

