binär in dezimal (2´er komplement)
-
liebes forum, liebe experten
ist wahrscheinlich für euch trivial, aber ich verzweifele:
brauche nen c-prog, mit dem ich eine binärzahl (16bit, 2´er
komplement (davon das zweite byte die nachkommastellen) in eine
dezimalzahl umwandeln kann.----------------------------------
0001 1001 0001 0000 --> +25,0625
1110 0110 1111 0000 --> -25,0625
----------------------------------habt ihr da ne lösung?
gruss
leidi
-
hi
ich hab deine frage nicht ganz nachvollziehen koennen aber ich hab mal n stückchen code geschrieben vielleicht kannste damit was anfangen
mfglinuxuser
#include <stdio.h> int main(){ int lauf = 4; int erg = 0; char input[16]; int puffer = 1; printf("Bitte geben Sie die Bitfolge ein...\n"); fgets(input, 18, stdin); while(lauf >= 0){ puffer *= 2; if(input[lauf] == '0'){ //do nix }else{ erg += puffer; }//end if lauf--; }//end while printf("Ergebnis: %d\n", erg); }//end main
-
#include <stdio.h> int main () { short x; x=0x1910; printf("%f\n",((double)x)/256); x=0xE5F0; printf("%f\n",((double)x)/256); return 0; }
einfach nach float oder double konvertieren und durch 256 teilen
-
Moin Moin!
@linuxuser:
sorry, dass ich deinen beitrag so unkommentiert stehen lasse, aber konfusius vorschlag sieht wesentlich einfacher aus@konfusius:
wie geil ist das denn?!?!
aber ich kapiere es nicht
wieso klappt es, wenn man den umgewandelten wert durch 256 dividiert? das grenzt für mich an hexerei
-
@konfutius
was mahchst du da ich haette mir gedacht man muss die binaere zahl einlaesen?@sleit
waenn du die sache etwas besser erklaerst koennte ich dir eine bessere loesung implementieren meine wandelt bis jetzt eine 16 bit zahl in einen int wert um...
ps:warum sieht das von konfutius einfacher aus waenn du es nicht kapierst?????
-
@Konf... --linuxuser-- hat recht, dein Programm ist nicht die richtige lösung für die Aufgabe!
Denn Hexadezimal ist nicht das gleiche wie Dual.mfg hohesC
-
dann versuche ich es ausführlich zu erklären:
ich möchte eine temperatur über einen sensor (ds1721) auswerten. wenn ich es richtig verstanden habe, dann stellt mir der sensor einen messwert im hex oder bin format zur verfügung (bin mir nicht ganz sicher, ob der sensor beides zur verfügung stellt (datenblatt seite 4). er hat halt ein register 2 byte groß, darin wird der wert im 2´er komplement abgelegt. das register muß ich halt auslesen). diese werte muß ich dann umwandeln.das heißt, dass ich die möglichkeit von konf... doch gut verwenden kann, oder?
-
für alle die mehr über den DS1721 wissen wollen:
http://pdfserv.maxim-ic.com/en/ds/DS1721.pdf
waenn ich heute zuhause bin werde ich ein proggy schreiben die das auswertet aber jetzt hab ich noch deutsch...
-
--linuxuser-- schrieb:
waenn ich heute zuhause bin werde ich ein proggy schreiben die das auswertet aber jetzt hab ich noch deutsch...
Du bist nen Schatz.
-
--linuxuser-- schrieb:
... aber jetzt hab ich noch deutsch...
Schaden kann's ja nicht
*scnr*
-
#include <stdio.h> enum BOOL {false, true}; int main(){ int vorz = false; int byte1 = 0; int byte2 = 0; int lauf = 7; int erg = 0; char input[16]; int puffer = 1; printf("Bitte geben Sie die Bitfolge ein...\n"); fgets(input, 16, stdin); while(lauf >= 1){ if(input[lauf] == '0'){ //do nix }else{ erg += puffer; }//end if puffer *= 2; lauf--; }//end while byte1 = erg; erg = 0; if(input[0] == '0') vorz = true; printf("Das ergebnis ist: "); if(vorz == true){ printf("+%d", byte1); }else{ printf("-%d", byte1); }//end if /*hier kann man dann die gleitkommazahl implementieren mit der mantisse und dem exponenten und kann das erg vom exponenten in byte2 speichern und dann muss man nur noch mit printf(".%d\n", byte2); den rest des ergebnises ausgeben ich will euch nicht den ganzen spass am proggen wegnehmen, also dann noch viel spass aber das von Konfusius kann auch funzeln denn der ds1721 liefert auch eine HEX zahl aber wem das programmieren spass macht nimmt meine lösung :-)))*/ }//end main
@TactX
REIN IN DIE ANARCHIE DER WORTE
-
das mit dem dividieren funktioniert ganz einfach:
du machst aus deiner festkommazahl eine ganzzahl, im dem du sie mit 256 multipliezierst. dann konvertierst du das ergebnis nach float un dividierst anschließend wieder durch 256. x*256/256=x.
das multiplizieren mit 256 kannst du dir aber sparen. da du deine festkommazahl als short darstellst, in dem das high-byte die vorkommastellen und das low-byte die nachkommastellen sind, liest dein c-compiler deine festkommazahl so, als wäre sie bereits mit 256 multipliziert.
also einfach nach float konvertieren und dann durch 256 dividieren.
-
#include <stdio.h> enum BOOL {false, true}; int main(){ int vorz = false; int byte1 = 0; int byte2 = 0; int lauf = 7; int erg = 0; char input[16]; int puffer = 1; printf("Bitte geben Sie die Bitfolge ein...\n"); fgets(input, 17, stdin); lauf = 0; while(lauf < 16){ printf("%c", input[lauf]); lauf++; }//end while printf("\n"); lauf = 7; while(lauf >= 1){ if(input[lauf] == '0'){ //do nix printf("0"); }else{ erg += puffer; printf("1"); }//end if puffer *= 2; lauf--; }//end while byte1 = erg; puffer = 1; erg = 0; lauf = 15; while(lauf >= 8){ if(input[lauf] == '0'){ //do nix printf("0"); }else{ erg += puffer; printf("1"); }//end if puffer *= 2; lauf--; }//end while byte2 = erg; erg = 0; if(input[0] == '0') vorz = true; printf("Das ergebnis ist: "); if(vorz == true){ printf("+%d", byte1); }else{ printf("-%d", byte1); }//end if short x = (short)byte2; printf(" %f\n",(x*256)*256/256); }//end main
ja das mit dem umwandeln funtelt nur das zweite byte ist doof da weiß ich nicht wie ich das umwandeln soll
vielleicht kann dir ein anderer dabei helfen
die zeileprintf(" %f\n",(x*256)*256/256);
ist das ausschlaggebende....