Hexadezimalzahl -> Dezimalzahl
-
hmmm nur mal so ob ichs verstanden hab.
für 11 wäre der code dann folgender:... if (c > '9') c = (c&0xdf) - 'B' + 11; else c -= '0'; ...
c ist vom typ char oder ?
hättest du vielleicht ein etwas längeres beispiel, denn irgend wie blick ich immer noch nicht ganz durch... bin was neben der spur im moment, sorry.
achja, das problem mit der eingabe ist auch noch da. also die realisierung von der wertigkeitvergabe. ich wüsste nur, wie ichs machen könnte, wenn der benutzer IMMER 8 ziffern eingibt. zu meinem nachteil soll er jedoch auch weniger eingeben können.
-
tim-buktu schrieb:
hmmm nur mal so ob ichs verstanden hab.
für 11 wäre der code dann folgender:nee, hast es leider nicht verstanden...
'c' ist die variable, der code bleibt unverändert.
wenn vorher c=='B' dann nachher c==11
:xmas2:
-
okay. ich stell mich mal in die ecke:D
kannst du mir noch erklären, was das (- 'A' + 10
) genau bewirkt und warum? für die ganz doofen wie mich halt
gut. bin eben von der arbeit gekommen, werd jetzt mal anfangen. weiß jedoch noch nicht wie das mit der wertigkeitverteilung umzusetzen ist. wenn man immer 8 ziffern eingibt, dann ists ja kein problem, aber bisher ist mir noch kein lich aufgegangen, wie es bei variabler anzahl funktionieren soll.
-
c = (c&0xdf) - 'A' + 10;
(c&0xdf) wandelt kleinbuchstaben wie 'a', 'h' usw. in großbuchstaben 'A', 'H' usw. um.
-'A' + 10 wandelt die zahl in dezimal um.
-'A' zieht erstmal von c den ascii-wert von 'A' ab. +10 kommt daher, weil 0-9 schon durch die abfrage vorher abgedeckt ist(if c > '9') und dann somit z.B. A, 10 ist.
Bsp.
'C' - 'A' == 2
2+10==12ps. sorry wenns nich gut formuliert ist, ist halt schon bisschen spät
-
alles klar. ich habs verstanden. wäre ich nich drauf gekommen.
so füße sind hochgelegt, kaffee steht aufm schreibtisch, jetzt kanns losgehen.
hmmm aber mit den wertigkeiten is mir immer noch nichts eingefallen. da brauch ich auf jedenfall noch hilfe, wenns möglich ist.
-
du meinst das mit der variablen anzahl ziffern?
wie wärs den mit einer variabel, die bei jeder neuen ziffer hochgezählt wird? (do-while schleife z.B.)
-
hatte ich auch schon dran gedacht.
das es 8 unterschiedliche fälle gibt. also wenn zählervariable 1 ist, dann wertigkeit 16^0 wenn 2 dann erste zahl 16^1 und zweite zahl 16^0... so meinst du das doch oder ?
gibt es da noch eine elegantere lösung?
-
3F = 3 * 16^1 + F *16^0
Du musst also von hinten mit 0 anfangen, egal wie lang der text ist.
-
BuddyHolly schrieb:
3F = 3 * 16^1 + F *16^0
Du musst also von hinten mit 0 anfangen, egal wie lang der text ist.ausgehend von dem code weiter oben:
unsigned long hexstring_to_number (char *str) { unsigned long res = 0; while (*str) { char c = *str++; if (c > '9') c = (c&0xdf) - 'A' + 10; // buchstaben ergeben 10...X else c -= '0'; // zahlen ergeben 0...9 if (c > 15) { // fehleingabe // muss irgendwie behandelt werden } else { // okay (0<=c<=15) res = (res<<4) + c; } } return res; }
-
ich hab mal wieder was nich ganz verstanden.
was bewirkt die variable res ?
und warum wird sie um 4 bit nach links verschoben?
-
tim-buktu schrieb:
ich hab mal wieder was nich ganz verstanden.
was bewirkt die variable res ?
und warum wird sie um 4 bit nach links verschoben?jede hexziffer steht für 4 bits (0x0 == 0000, 0xf == 1111).
'res' akkumuliert diese bits. für jede neue ziffer (eine stelle mehr) wird res erstmal 4 mal links geschoben (entspricht einer multiplikation mit 16) und dann kommen die neuen 4 bits an die frei gewordenen stellen...
:xmas2:testing...
-
tim-buktu schrieb:
ich hab mal wieder was nich ganz verstanden.
was bewirkt die variable res ?
und warum wird sie um 4 bit nach links verschoben?Egal. Machst doch ganz einfach
summe = 0 Text von hinten her durchgehen { wenn textzeichen bei aktueller position zwischen '0' und '9' summe += (textzeichen bei aktueller position - '0') * 16^(länge-position) sonst das selbe mit 'a' bis 'f' }
Dann brauchst du auch nix schieben.
-
ten schrieb:
res = (res<<4) + c;
Mach doch aus dem + noch ein | dann wirds noch elitärer
-
TactX schrieb:
ten schrieb:
res = (res<<4) + c;
Mach doch aus dem + noch ein | dann wirds noch elitärer
stimmt. grundrechenarten und bitoperationen gemischt sieht doof aus
-
ah, super, ich glaub ich hab beides jetzt verstanden,
werde aber erst einmal das umsetzen:summe = 0 Text von hinten her durchgehen { wenn textzeichen bei aktueller position zwischen '0' und '9' summe += (textzeichen bei aktueller position - '0') * 16^(länge-position) sonst das selbe mit 'a' bis 'f' }
und wenn das super geklappt hat und ich noch zeit habe,mach ich mich an die meiner meinung nach kompliziertere variante
bin mal gespannt ob ich morgen vormittag genug zeit dafür habe. hab mich in das thema zeiger noch nicht so ganz reingelesen, deshalb könnte es sein, das ich diesbezüglich ein paar schwierigkeiten bekomme und mich noch mal melde, ansonsten schon mal vielen vielen dank !
-
char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'}; int dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15}; char hex[256] = "ffffffff"; int zahl = 0; for (int i = 0; i < 8; i++) { for (int j = 0; j < 24; j++) if (hex[i] == hextab[j]) { zahl <<= 4; zahl |= dectab[j]; break; } printf("Fehler in Hexzahl!"); break; }
:xmas1:
-
verfluchte fehler
char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'}; int dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15}; char hex[256] = "ffffffff"; int zahl = 0; for (int i = 0, j; i < 8; i++) { for (j = 0; j < 24; j++) { if (hex[i] == hextab[j]) { zahl <<= 4; zahl |= dectab[j]; break; } } if (hex[i] != hextab[j]) { printf("Fehler in Hexzahl!"); break; } }
-
spagetti schrieb:
zahl |= dectab[j];
zahl |= (j%16 + j/16*10);
:xmas2:
-
hmmm, ich bekomms nicht hin...
ich scheitere schon bei der eingabe von der hexzahl.
welche variable wird für die eingabe genutzt, und wie sieht da die syntax aus?
wenn ich etwas mitgets ( variable );
mache, spuckt er mir einen fehler beim compilieren aus.
könntet ihr mir ne erklärung zu den verwendeten variablen geben, ich verstehe es leider einfach nichtdaher schaff ichs auch nich das "drum herrum" zu programmieren.
achja und ein frohes neues wünsche ich
-
tim-buktu schrieb:
gets ( variable );
char variable[256]; gets (variable);
aber vorsicht,
nicht mehr als 'sizeof(variable)-1' zeichen eingeben, weil 'gets' nicht weiss wieviel platz da ist...
:xmas2: