# dezimalzahl in hexadezimalzahl umwandeln



## rudirijkaard (1. Dez 2005)

hallo
ich soll ein programm schreiben, das als parameter eine positive ganze zahl übergeben bekommt und diese zahl als string im hexadezimalformat zurückliefern soll
leider hab ich das bisher nur so hinbekommen, dass mir die hexadezimalzahl in der falschen reihenfolge ausgegeben wird
wie kann ich dieses problem beheben?
ich denke mal, dass ich in der switch-anweisung die system.out.print befehle durch etwas anderes ersetzen muss
kann mir jemand von euch vielleicht weiterhelfen?
gruß rudi



```
public class Ausgabe {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		hexadezimal(4888);
	}
	
	public static void hexadezimal(int zahl){
	    
	    while(zahl>0){
	  	int Rest=zahl%16;
		
	  	
		switch(Rest){
		case 0:System.out.print("0");
		       break; 
		case 1:System.out.print("1");
		       break; 
		case 2:System.out.print("2");
		       break; 
		case 3:System.out.print("3");
		       break; 
		case 4:System.out.print("4");
		       break; 
		case 5:System.out.print("5");
		       break; 
		case 6:System.out.print("6");
		       break; 
		case 7:System.out.print("7");
		       break; 
		case 8:System.out.print("8");
		       break; 
		case 9:System.out.print("9");
		       break; 
		case 10:System.out.print("A");
		       break; 
		case 11:System.out.print("B");
		       break; 
		case 12:System.out.print("C");
		       break; 
		case 13:System.out.print("D");
		       break; 
		case 14:System.out.print("E");
		       break; 
		case 15:System.out.print("F");
	    }
	
		
		zahl=zahl/16;
		}
	}
	
		
}
```


----------



## L-ectron-X (1. Dez 2005)

Mit Integer.toHexString(...) gibts eine vorgefertigte Anweisung. Weiß nicht, ob du die nutzen darfst?


----------



## Guest (1. Dez 2005)

wohl leider nicht
aber könnte ich die werte nicht irgendwie in einem array speichern
und mir dann rückwärts ausgeben lassen?
wenn ja, wie wie würde das funktionieren?


----------



## Zubi81 (1. Dez 2005)

*Salü rudirijkaard*

Eine Möglichkeit für die Umrechnung vom Dezimalsystem ins Sedezimalsystem kannst du über die Divisionsreste machen...

8 = 4888 modulo 16
1 = 305 modulo 16
3 = 19 modulo 16
1 = 1 modulo 16

Jetzt das ganze von unten nach oben lesen: 4888(dez) = 1318(hex)

Nun musst du das ganze nur noch in Java umsetzen. Sollte nicht so schwer sein...  :meld: :wink:

Grüsse aus der kalten Schweiz nach irgendwo!  :wink: 
Zubi


----------



## Guest (1. Dez 2005)

sry zubi81

hab leider keine ahnung wie ich das umsetzen soll
musst bedenken ich hab erst vor kurzem mit java angefangen


----------



## Zubi81 (1. Dez 2005)

Uups  , ich sollte mal den Source vorgängig besser anschauen. Das Konzept hast du ja irgendwie schon. Aber so kannst du es nicht implementieren. 

Ich würde dir empfehlen das Ganze rekursiv machen. Nachfolgend *Pseudocode*:


```
main {

  string s = dez2hex(4888)
  print(s)

}

dez2hex(int x) {

  int r = x % 16
  string tmp

  switch (r)
    case 10: tmp = new string("A")
    case 11: tmp = new string("B")
    ...
    case 15: tmp = new string("F")
    default:
      tmp = new string(r)
  end switch

  if ((x / 16.0) < 1) {
    return tmp
  }
  
  return dez2hex(x/16) + tmp

}
```


----------



## Guest (1. Dez 2005)

gibt es auch irgendeine möglichkeit meinen code etwas zu verändern, damit er funktioniert?


----------



## Zubi81 (1. Dez 2005)

Salü Rudi

Vergleich deinen Code mit meinem Pseudocode und du entdeckst deine Fehler. Wenn du der Ablauf meines Pseudocodes verstehst, kannst du Ihn auch ganz einfach mit Java nachprogrammieren. ???:L 

  :### Rekursion in Wikipedia
  :### Satz von Euklid - bestes Beispiel für eine Rekursion

Ich gehe mal davon aus, dass du die Grundlagen zu Java in der Schule / im Studium hattest!? Sonst hier eine gute Onlinequelle:

  :### Java Theorie

Ich wünsche noch viel Erfolg beim Lösen der Aufgabe. 

Ich gehe jetzt schlafen :gaen: 

P.S. Schreib mir, was mein Pseudocode macht, dann liefere ich dir vielleicht morgen den vollständigen Javacode! :wink:


```
// ...

public static void main(String[] args) {

  String s = dec2hex(4888);
  System.out.println(s);

}

public String dec2hex(int x) {

  // ...

}

// ...
```


----------



## Slava (2. Dez 2005)

also du hast sehr gute vorsläge bekommen1
aber wenn du sturr bei deine variante bleiben möchtest
bitte schön

```
public class Ausgabe {

   /**
    * @param args
    */
   java.util.Stack hexwert;
   public static void main(String[] args) {
      hexadezimal(4888);
   }

   public static void hexadezimal(int zahl){
      java.util.Stack <String> hex=new java.util.Stack<String>();
       while(zahl>0){
        int Rest=zahl%16;


      switch(Rest){
      case 0:hex.push("0");
             break;
      case 1:hex.push("1");
             break;
      case 2:hex.push("2");
             break;
      case 3:hex.push("3");
             break;
      case 4:hex.push("4");
             break;
      case 5:hex.push("5");
             break;
      case 6:hex.push("6");
             break;
      case 7:hex.push("7");
             break;
      case 8:hex.push("8");
             break;
      case 9:hex.push("9");
             break;
      case 10:hex.push("A");
             break;
      case 11:hex.push("B");
             break;
      case 12:hex.push("C");
             break;
      case 13:hex.push("D");
             break;
      case 14:hex.push("E");
             break;
      case 15:hex.push("F");
       }


      zahl=zahl/16;
      }
     while(!hex.empty())System.out.print(hex.pop());
   }


}
```
aber ich habe das nicht programmiert


----------



## Mag1c (2. Dez 2005)

Hi,

du könntest das ganze auch rekursiv machen:


```
public class Ausgabe { 

   /** 
    * @param args 
    */ 
   public static void main(String[] args) { 
      hexadezimal(4888); 
   } 
    
   public static void hexadezimal(int zahl){ 
      
      if (zahl > 15) hexadezimal(zahl/16);

      int Rest=zahl%16; 
         
      switch(Rest){ 
         case 0:System.out.print("0"); 
             break; 
         case 1:System.out.print("1"); 
             break; 
         case 2:System.out.print("2"); 
             break; 
         case 3:System.out.print("3"); 
             break; 
         case 4:System.out.print("4"); 
             break; 
         case 5:System.out.print("5"); 
             break; 
         case 6:System.out.print("6"); 
             break; 
         case 7:System.out.print("7"); 
             break; 
         case 8:System.out.print("8"); 
             break; 
         case 9:System.out.print("9"); 
             break; 
         case 10:System.out.print("A"); 
             break; 
         case 11:System.out.print("B"); 
             break; 
         case 12:System.out.print("C"); 
             break; 
         case 13:System.out.print("D"); 
             break; 
         case 14:System.out.print("E"); 
             break; 
         case 15:System.out.print("F"); 
      } 
   } 
}
```

Gruß
Mag1c


----------



## Mag1c (2. Dez 2005)

Hi,

noch eine Variante mit StringBuffer:


```
public class Ausgabe { 

   /** 
    * @param args 
    */ 
   public static void main(String[] args) { 
      hexadezimal(4888); 
   } 
    
   public static void hexadezimal(int zahl){ 
       StringBuffer buf = new StringBuffer();

       while(zahl>0){ 
        int Rest=zahl%16; 
       
         
      switch(Rest){ 
      case 0:buf.insert(0, '0'); 
             break; 
      case 1:buf.insert(0, '1'); 
             break; 
      case 2:buf.insert(0, '2'); 
             break; 
      case 3:buf.insert(0, '3'); 
             break; 
      case 4:buf.insert(0, '4'); 
             break; 
      case 5:buf.insert(0, '5'); 
             break; 
      case 6:buf.insert(0, '6'); 
             break; 
      case 7:buf.insert(0, '7'); 
             break; 
      case 8:buf.insert(0, '8'); 
             break; 
      case 9:buf.insert(0, '9'); 
             break; 
      case 10:buf.insert(0, 'A'); 
             break; 
      case 11:buf.insert(0, 'B'); 
             break; 
      case 12:buf.insert(0, 'C'); 
             break; 
      case 13:buf.insert(0, 'D'); 
             break; 
      case 14:buf.insert(0, 'E'); 
             break; 
      case 15:buf.insert(0, 'F'); 
       } 
      zahl=zahl/16; 
      }
    System.out.println(buf.toString());
   } 
}
```

Gruß
Mag1c


----------



## beginnner (5. Jan 2006)

L-ectron-X hat gesagt.:
			
		

> Mit Integer.toHexString(...) gibts eine vorgefertigte Anweisung. Weiß nicht, ob du die nutzen darfst?




```
public class HexTest {


	public static void main(String[] args) {

		String s2 = toHexString(185);
		System.out.println(s2);
	}
	
	public static String toHexString(int i){

		String s = toHexString(i);
		return s;
	}

}
```

Das stimmt wohl irgend wie nicht, zeigt fatal error. 
Kann mir jemand einen Tipp geben wo der Fehler liegen koennte? (int 185 in Hexa Darstellung)


----------



## Zubi81 (5. Jan 2006)

Du machst da einen rekursiven Aufruf... Richtig wäre:


```
String s = Integer.toHexString(i)
```


----------



## beginnner (5. Jan 2006)

ok, jo hab ich nicht beachtet.
(Danke fuer die schnelle Antwort )


----------



## Bleiglanz (5. Jan 2006)

Vorzeichen?

andere Variante:

```
public static final char[] HEXDIGITS = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    public static String intToHex(int zahl) {
        final boolean negative = (zahl < 0);  
        zahl = negative ? -zahl : zahl;
        final char[] res = new char[8];
        for(int i=0;i<8;i++){
            res[8-i-1] = HEXDIGITS[(zahl>>(4*i))&(0x000F)];          
        }
        if(negative)
            return "-"+String.valueOf(res);
        else
            return String.valueOf(res);
    }
```


----------

