Umrechnungen in andere Zahlensysteme

hier eine einfache Aufgabe von elite-noob:

Aufgabenstellung:

Ein Programm schreiben welches Dezimahlzahlen in Hexadezimalzahlen, oktalzahlen, und dualzahlen umrechnet.

Erweiterungen
- das ganze in jede richtung ermöglichen also dual in dezimal oder dezimal in dualzahlen
- evtl. auch noch in andere zahlenformate
- die möglichkeit selber die basis anzugeben (bei dualzahlen ist das 2 bei hexadeziamalzahlen 16 etc.

viel spass ;)
 
Mmmmh das hab ich mal vor längerer Zeit gemacht musste für einen Bruteforcer in PHP sein müsste eigentlich noch so funtzen:

PHP:
function resystem ($Wert,$system)
{
$zeichen = array ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Y','Z');
while ($Wert>=1)
 {
 $Rest = $Wert%$system;
 if ($Rest>=10)
  {
  $Rest = $zeichen[$Rest-10];
  }
 $Rückgabe[] = $Rest;
 $Wert = floor($Wert/$system);
 }
$Rückgabe = array_reverse ($Rückgabe,TRUE);
$Rückgabe = implode ('',$Rückgabe);
return $Rückgabe;
}
echo resystem(234,16);

Für den Rest bin ich heut zu müde vll mach ich morgen ne Erweiterung.
 
@CPU8080 :

Ich hab dein Programm mal getestet und was ich persoenlich schlecht finde das der 0 und negative zahlen nicht umrechnen konnte.

Also hab ich dein programm noch was ergeanzt:

PHP:
<?php 
function resystem ($Wert,$system) {
  $zeichen = array ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Y','Z');
	$minus = 0;
	if ($Wert < 1) {
	  $Wert = $Wert*-1;
		$minus = 1;
	}
	if ($Wert != 0) {
    while ($Wert>=1) {
      $Rest = $Wert%$system;
      if ($Rest>=10) {
        $Rest = $zeichen[$Rest-10];
      }
      $Rückgabe[] = $Rest;
      $Wert = floor($Wert/$system);
    }
    $Rückgabe = array_reverse ($Rückgabe,TRUE);
    $Rückgabe = implode ('',$Rückgabe);
	  if ($minus == 1) {
	    $Rückgabe = "-".$Rückgabe;
	  }
	} else {
	  $Rückgabe = 0;
	}
  return $Rückgabe;
}
echo resystem(200,16);
?>

Jon2
 
@Jon2 jo so ist es auf jedenfall besser, aber müsste man es wenn mans genau nimmt net so machen das man das mit nem signed byte oder wie das heiß machen muss. Also bei ner negativen Zahl erst eine not operation durchführen muss und dann 1 addieren muss.
Beispiel:
Dez:-5
Hex: FFFFFFFFFFFFFFFB
So sagt mir der WinRechner das auch
 
Code:
;also: in cx die basis
;in SI der Wert,in BX die Adresse der Zeichen-Tabelle, in DI die Adresse des Outputbuffers
WORD2x_LOOP:
   xor dx,dx
   mov ax,si
   div cx
   mov si,ax ;neuer Wert   
   
   ;Rest ausgeben
    push bx
    add bx,dx                               ; Tabellenindex+rest =ASCII-Wert Position für den Wert
    mov dl,byte ptr [bx]                ;ASCII Zeichen aus  Tabelle[Restindex] lesen
    dec di                                       ;Output wird "verkehrt herum" beschrieben
    mov byte ptr [di],dl                  ;ASCII Zeichen schreiben 
    pop bx   
   test ax,ax                     ;wenn 0 dann sind wir fertig
   je ende_ 
jmp WORD2x_LOOP
ende_:

Code:
CSEG segment
org 100h
MAX_INPUT equ 10
Begin:
 
call einlesen ;basis
push si
call einlesen ;zahl
;in si wert

;in cx ist die Basis
pop cx
mov di,offset output
add di,100
mov byte ptr [di],'$'
mov bx,offset tabelle

;also: in cx die basis
;in SI der Wert,in BX die Zeichen-Tabelle, in DI der Outputbuffer
WORD2x_LOOP:
   xor dx,dx
   mov ax,si
   div cx
   mov si,ax ;neuer Wert   
   
   ;ausgeben
    push bx
    add bx,dx ;Zeichen aus  Tabelle[Rest] lesen
    mov dl,byte ptr [bx]
    dec di    
    mov byte ptr [di],dl    
    pop bx   
   test ax,ax
   je ende_ 
jmp WORD2x_LOOP

ende_: 
    ;ergebnis ausgeben
    mov ah,9
    mov dx,di
    int 21h
    mov ah,1
    int 21h  
    int 20h



einlesen:
;//Einlesen
    mov bx,offset input
    
    mov ah,0ah
    mov dx,bx
    int 21h
    ;gleich einen Zeilenumbruch nachschieben
     mov ah,06
     mov dl,10
     int 21h

    ;umrechenen Ascii2Number, in BX ist input_offset
    
     xor cx,cx
     mov cl,byte ptr[bx+1] ;wieviele Zeichen eingelesen
    
     add bx,1 ;offset in position bringen
     add bx,cx

     xor ax,ax
     mov di,1
     xor si,si
     
     ASCII2WORD_LOOP:
        xor ax,ax
        mov al,byte ptr [bx]
        sub al,'0' 
        mul di
        add si,ax
        mov ax,di
        mov di,10
        mul di
        mov di,ax      
        dec bx
        dec cx       
      jnz ASCII2WORD_LOOP
;in SI ist jetzt die umgerechnete Eingabe
retn

tabelle db "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"
input db MAX_INPUT
output db ?

CSEG ends
end Begin
wobei ich jetzt nicht der DOSe-Pro-grammierer bin ;) und deswegen auch nicht immer die eleganteste Lösung gewählt habe.
Konvertiert in diesem Beispiel vorzeichenlose Dezimalzahlen in Darstellung zur Basis X, wobei die Basis X aufgrund von Zeichenmangel auf 36 beschränkt ist (0-9,A-Z) ;) . Programmbedienung:
zuerst die Basis angeben und in der nächsten Zeile eine Zahl < 2^16.
 
Mein C++-Programm ist zwar nicht besonders schön oder schnell (ich bin Anfänger, vielleicht könnt ihr mir ein bisschen helfen), aber es beherrscht die Umformung von allen positiven natürlichen Zahlen und 0 von einem beliebigen Zahlensystem in ein anderes beliebiges Zahlensystem.
Beispiel: ./convert 8 2 10 wandelt 10 vom Oktal- ins Binärsystem.
Code:
#include <iostream>

using namespace std;

int potenz(int x, int n)
{
    int potenz = 1;
    for(int k=1; k<n; k++)
    {
        potenz *= x;
    }

    return potenz;
}

int sys2dez(char* value, int sys)
{
    string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int val_len = strlen(value);
    int out = 0;

    for(int i=0; i<val_len; i++)
    {
        short j = 0;
        while(value[i] != digits[j])
        {
            j++;
            if(j > 36)
            {
                cerr << "ERROR: input value is incorrect" << endl;
                return -1;
            }
        }

        out += j * potenz(sys, val_len-i);
    }

    return out;
}

string dez2sys(int value, int sys)
{
    string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string out = "";
    while(value != 0) {
        out = digits[value % sys] + out;
        value /= sys;
    }

    return out;
}

int main(int argc, char* argv[])
{
    if(argc < 4)
    {
        cerr << "Usage: " << argv[0] << " input output value" << endl
             << "\texample: " << argv[0] << " 16 10 FF (returns 255)" << endl;
        return -1;
    }

    // Arguments
    bool verbose = true;

    char* value = argv[3];
    int input = atoi((char *)argv[1]);
    int output = atoi((char *)argv[2]);

    int dez = sys2dez(value, input);
    string out = dez2sys(dez, output);

    if(verbose)
    {
        cout << "Berechne " << value << " vom " << input << "er-System ins " << output << "er-System..." << endl
             << input << "er-System:\t" << value << endl;

        if(input != 10)
            cout << "10er-System:\t" << dez << endl;

        if(output != 10)
            cout<< output << "er-System:\t" << out << endl;
    }
    else
    {
        cout << out << endl;
    }
}
 
naja, ich hab gerade etwas anderes in PVX gemacht, undzwar muss man hier ein ASCII zeichen eingeben, dann nimmt das Programm davon die Hexadezimalzahl, rechnet diese um ins Dezimalsystem und vom Dezimalsystem ins Binär-, Oktal-, und Duodezimalsystem.

Hier der Code:
Code:
Anfang:
INPUT "Geben Sie bitte ein beliebiges ASCII Zeichen ein: ",A$

BINA$="00000000"
OKTA$="000"
HEXA$=HTA(A$)
DUOD$="000"
Lob=LEN(HEXA$)
Eki=1
DEZI=0
IF LEN(A$)>1 THEN {
	PRINT 'CS',
	PRINT "Sie haben eine falsche eingabe get",CHR(228),"tigt, bitte wiederholen Sie ihre eingabe!"
	GOTO Anfang
} ELSE {
FOR I=Lob TO 1 STEP -1
IF HEXA$(I,1)>STR(9) THEN {
	SWITCH (HEXA$(I,1))
	CASE "A"
	Funor=10
	BREAK
	CASE "B"
	Funor=11
	BREAK
	CASE "C"
	Funor=12
	BREAK
	CASE "D"
	Funor=13
	BREAK
	CASE "E"
	Funor=14
	BREAK
	Case "F"
	Funor=15
	END SWITCH
} ELSE {
Funor=NUM(HEXA$(I,1))
}
Funor=Funor*Eki
Eki=Eki*16
DEZI=DEZI+Funor
NEXT

DEZR=DEZI

FOR I=8 TO 1 STEP -1
BINA$(I,1)=STR(MOD(DEZR,2))
IF DEZR<>0 THEN DEZR=DEZR/2
NEXT

DEZR=DEZI

FOR I=3 TO 1 STEP -1
OKTA$(I,1)=STR(MOD(DEZR,8))
IF DEZR<>0 THEN DEZR=DEZR/8
NEXT

DEZR=DEZI

FOR I=3 TO 1 STEP -1
D=INT(MOD(DEZR,12))
IF D=10 THEN {
	DUOD$(I,1)="A"
} 
IF D=11 THEN {
	DUOD$(I,1)="B"
} 
IF D<>10 AND D<>11 THEN {
	DUOD$(I,1)=STR(INT(MOD(DEZR,12)))
}
IF DEZR<>0 THEN DEZR=INT(DEZR/12)
NEXT


IF OKTA$(1,1)="0" THEN {
	OKTA$(1,1)=OKTA$(2,1)
	OKTA$(2,1)=OKTA$(3,1)
	OKTA$(3,1)=""
	IF OKTA$(1,1)="0" THEN {
		OKTA$(1,1)=OKTA$(2,1)
		OKTA$(2,1)=""
	}
}

IF DUOD$(1,1)="0" THEN {
	DUOD$(1,1)=DUOD$(2,1)
	DUOD$(2,1)=DUOD$(3,1)
	DUOD$(3,1)=""
	IF DUOD$(1,1)="0" THEN {
		DUOD$(1,1)=DUOD$(2,1)
		DUOD$(2,1)=""
	}
}

IF BINA$(1,1)="0" THEN {
	BINA$(1,1)=BINA$(2,1)
	BINA$(2,1)=BINA$(3,1)
	BINA$(3,1)=BINA$(4,1)
	BINA$(4,1)=BINA$(5,1)
	BINA$(6,1)=BINA$(7,1)
	BINA$(7,1)=BINA$(8,1)
	BINA$(8,1)=""
	IF BINA$(1,1)="0" THEN {
		BINA$(1,1)=BINA$(2,1)
		BINA$(2,1)=BINA$(3,1)
		BINA$(3,1)=BINA$(4,1)
		BINA$(4,1)=BINA$(5,1)
		BINA$(6,1)=BINA$(7,1)
		BINA$(7,1)=""
			IF BINA$(1,1)="0" THEN {
			BINA$(1,1)=BINA$(2,1)
			BINA$(2,1)=BINA$(3,1)
			BINA$(3,1)=BINA$(4,1)
			BINA$(4,1)=""
				IF BINA$(1,1)="0" THEN {
				BINA$(1,1)=BINA$(2,1)
				BINA$(2,1)=BINA$(3,1)
				BINA$(3,1)=""
					IF BINA$(1,1)="0" THEN {
					BINA$(1,1)=BINA$(2,1)
					BINA$(2,1)=""
				}
			}
		}
	}
}

PRINT 'CS',
PRINT "Sie haben das ASCII Zeichen ",A$," eingegeben!"
PRINT "Hier nun die Ergebnisse der Umrechnung:"
PRINT "Bin",CHR(228),"r:       ",BINA$
PRINT "Oktal:       ",OKTA$
PRINT "Dezimal:    ",DEZI
PRINT "Duodezimal:  ",DUOD$
PRINT "Hexadezimal: ",HEXA$
}
 
Code:
#include <stdio.h>

int
main (int argc, char *argv[])
{
        int base = 0, num = 0, n;
        if (argc < 3) {
                printf("Zwei Argumente benötigt:\n<Zahl> <Basis>\n\n");
                return -1;
        }
        num  = atoi(argv[1]);
        base = atoi(argv[2]);
        if (!num || (base < 2)) {
                printf("Zahl > 0, Basis > 1.\n\n");
                return -2;
        }
        for (n=0; n<40; n++) printf(" ");
        while (num > 0) {
                n = num % base;
                if (n > 10) printf("%c\b\b", n+55); else printf("%i\b\b", n);
                num = (int) num/base;
        }
        printf("\n");
        return 0;
}
 
Ist jetzt Bloss Dez->Hex, für mehr bin ich zu träge.

Java.
Code:
public static String dez2hex(int i){
	int mod;
	return i<=0?"":dez2hex((i-(mod=i%16))/16)+(mod<10?mod:(char)('a'+mod-10)+"");
}
 
Zurück
Oben