Frage von TummiTM, 72

Hexadezimal zu Dezimal umrechnen...Geht dass ohne Funktionen.. Und wenn ja, dann wie?

Wie schon oben beschrieben versuche ich bzw soll ich versuchen Hexadezimal in Dezimal um zu rechnen in einem PHP programm.. Nun ist aber das Problem, dass ich keine Funktionen verwenden darf.. Könnte wenn ichs gut mache mir 15 Punkte (1+) verdienen.. Wäre echt cool wenn jemand ne Ahnung hat und diese auch mitteilt :) MFG TummiTM (edit: würde auch gerne wissen wie dezimal zu hexadezimal geht :)  danke im voraus) 

Antwort
von eddiepoole, 27

beides sind stellenwertsysteme. damit löst sich das problem praktisch von alleine. dein programm geht einfach alle ziffern von rechts nach links durch. und addiert den wert der stellen.

beispiel: 185 = 5x1 + 8x10 + 1*100 oder verallgemeinert:

5 mal (n hoch 0) + 8 mal (n hoch 1) + 1 mal (n hoch 2)

wobei n die basis des stellenwertsystems ist. die verallgemeinerung funktioniert also auch beim binärsystem. ein binäres 1011 wäre demnach...

1 mal (2^0) plus 1 mal (2^1) plus 0 mal (2^2) plus 1 mal (1^3)  also:

1x1 + 1x2 + 0x4 + 1x8   also elf.

das in einen algorithmus zu überführen dürfte ein kinderspiel sein.

Kommentar von RakonDark ,

genau so wirds gemacht .

Kommentar von eddiepoole ,

für die "ziffern" a bis f solltest du einen filter in form einer selbstefinierten funktion schreiben. das ist am übersichtlichsten und leserlichsten.

Kommentar von RakonDark ,

ach wat, da nimmt man das ascii system für und zieht den entsprechenden wert ab ,

A= 65  , soll 10 werden , also ascii(A) - 55 .

dabei hattest du es so schön mathematisch und dann sowas ... tztztz

Kommentar von eddiepoole ,

sehr kreativ, schön und ökonomisch! erinnert mich an meine anfänge vor 20 jahren (mit basic noch). ich würde das trotzdem in eine funktion packen. bin eben kein mathematiker mehr :) sondern programmierer und da gehts in der praxis immer auch um leserlichkeit.

Kommentar von RakonDark ,

das hat nix mit leserlich zu tun , die tabelle gibts schon , also nutzen . funktionen sind viel zu viel des guten .

Kommentar von eddiepoole ,

die tabelle gibt es freilich schon, aber ist im ascii-system die differenz zwischen den ordnungszahlen von "a" und "9" dieselbe wie die wertdifferenz im hex-system zwischen a und 9? nein. schon brauchen wir irgendwelche if's. und schon sind wir auf dem weg zu holprigem spagetticode. die entscheidung, wie zeichen von 0-9 einerseits und zeichen von a-f andererseits zu behandeln sind, in eine funktion auszulagern ist für mich praxisgerechter und bequemer.

Kommentar von RakonDark ,


differenz zwischen den ordnungszahlen von "a" und "9" dieselbe wie die
wertdifferenz im hex-system zwischen a und 9? nein. schon brauchen wir
irgendwelche if's. und schon sind wir auf dem weg zu holprigem
spagetticode. die entscheidung, wie zeichen

 ich hab auch nicht behauptet 0-9 und A-F ins gleiche zu packen . das interpretierst du jetzt da rein , da ist nix spagetti

ich schreibs mal im üblichen code

result = 0;
hex = 16;
for (izeichen = 0 ; izeichen < zeichen.length ; ++izeichen)
{
zahl = 0;
if (ascii(zeichen[izeichen] ) > 47 AND  ascii(zeichen[izeichen] ) < 58)
{
zahl = ascii(zeichen[izeichen] ) - 47  ;
}
else
{
zahl = ascii(upper(zeichen[izeichen]))-55 ;
}
result += zahl* ( hex ^ izeichen);
}

// finaly the result in result :)




Kommentar von RakonDark ,

ups die schleife muss natürlich andersrum , also von length-1 zu 0

Kommentar von RakonDark ,

oder bei result (hex ^(zeichen.length - (izeichen +1)))

Kommentar von eddiepoole ,

bist du ganz sicher, dass das ein php-code ist? die funktionen ascii und upper kenne ich nicht, das zirkumflex bewirkt in php keine potenzierung und die variablen sehen aus wie konstanten. und ein bisschen spagetti ist es natürlich schon, wenn auch nicht im engeren sinn; ich sehe einen nahezugleichen ausdruck zwei mal. bei mir hätte das eher so ausgesehen...

$beispiel= "f90";
for ($n=strlen($beispiel)-1; $n>=0; $n-=1)
{
$summe+= pow(16,$pot) * numwert( substr($beispiel,$n,1) );
$pot+=1;
}

function numwert($y)
{
$y=strtoupper($y);
$equ = ord($y)-48; if($equ>9) {$equ-=7;}
return $equ;
}

Kommentar von RakonDark ,

ünrigens hast du vergessen das eine HEX eingabe sowieso nicht aus ZAHLEN besteht sondern aus ZEICHEN . Ergo kann man das mit einem if lösen und den abwasch nicht verkomplizieren .

Kommentar von eddiepoole ,

vergessen... woraus schließt du das?

Kommentar von RakonDark ,

und damit man nicht ewig a und A vergleichen muss , gleich ein upper() durchführen . dann ist es ein abwasch .

Antwort
von LeonardM, 26

Kannst du nach dem hex horner schema machen. Allerdings musst du wenn buchstaben zb wie "FF" im hexcode sinf die erstmal zu zahlen umwandeln. Am bestem via str_replace und ner liste

Antwort
von NoTrolling, 26

http://www.mathe-lexikon.at/mengenlehre/zahlensysteme/hexadezimalzahlen/hexadezi...

Schau mal vllt. hier.

Kommentar von TummiTM ,

Danke aber an sich kann ich das umrechen ja :) soll nur was mit PHP schreiben,  was das von alleine kann..  Und halt auch dezimal zu hexadezimal :) 

Antwort
von RakonDark, 7

hex 2 dez und dez 2 hex

als JavaScript

http://praetorians.me/test/hexdez.html

mittels ASCII Zeichensatz

Antwort
von Radyschen, 45

TheSimpleClub auf YouTube, die haben da was drüber

Antwort
von NoTrolling, 37

Was meinst du mit "keine Funktion verwenden"? Irgendeine Abbildungsvorschrift wirst du ja brauchen...

Kommentar von TummiTM ,

Naja mein lehrer meinte das es in PHP halt direkte funktionen gibt also vordefinierte..  Diese dürfen wir nicht nutzen. 

Kommentar von NoTrolling ,

Achso^^

Kommentar von eddiepoole ,

DIE funktion, die genau das macht, darf man natürlich nicht benutzen. aber substr() darf man sicher einsetzen.

Antwort
von RakonDark, 12


result = 0;
hex = 16;
for (izeichen = 0 ; izeichen < zeichen.length ; ++izeichen)
{
zahl = 0;
if (ascii(zeichen[izeichen] ) > 47 AND  ascii(zeichen[izeichen] ) < 58)
{
zahl = ascii(zeichen[izeichen] ) - 47  ;
}
else
{
zahl = ascii(upper(zeichen[izeichen]))-55 ;
}
result += zahl* ( hex ^ (zeichen.length - izeichen +1) );
}

// finaly the result in result :)



musst nur noch ins java übersetzen .

ich hoffe das man die schleife nicht umdrehen muss .


Kommentar von RakonDark ,

ups kleiner fehler

result += zahl* ( hex ^ (zeichen.length - (izeichen +1)) );
Kommentar von RakonDark ,

und noch ein fehler muss -48 sein

zahl = ascii(zeichen[izeichen] ) - 48  

Keine passende Antwort gefunden?

Fragen Sie die Community