Potenzieren und Umwandeln
-
Hi, warum funktioniert der folgende Code nicht richtig?
# include <stdio.h> # include <stdlib.h> # include <math.h> void main () { double i; double erg=0; char feld[] = {1,0,1,1,0,1,1,0}; for (i=7;i>=0;i--) { erg = erg + (feld[i]*pow (2,i)); } printf ("%f\n",erg); }
Vielleicht habe ich ja nur einen Denkfehler eingebaut oder so. Schaut mal bitte. Jedenfalls sollte (meiner Meinung nach) 182 raus kommen, es sind aber nur 109. Was ich damit anstellen will, sollte klar sein, nämlich eine Binärzahl in eine Dezimalzahl umwandeln. Geht das vielleicht auch einfacher? Außerdem habe ich das Problem, dass das Ergebnis vom Typ double ist, ich brauche es aber unbedingt als unsigned int. Hat da jemand eine Idee?
Danke schonmal, larsen
-
Du verwendest feld[0] als Einer-Bit. Wie soll da eine gerade Zahl herauskommen?
-
Ein Feld-Index als double
Bitte ein int an dieser Stelle!!!Es kommt deshalb 109 raus, weil du das least-significant-bit für das most-significant-bit hältst!
# include <stdio.h> # include <stdlib.h> # include <math.h> int main (void) { int i; unsigned int erg=0; char feld[] = {1,0,1,1,0,1,1,0}; // LSB MSB for (i=7;i>=0;i--) { erg = erg + (feld[i]*(unsigned int)pow (2,i)); } printf ("%d\n",erg); return 0; }
-
Statt dieser pow(2,x)-Geschichte würde ich hier auf Bitmanipulation setzen. Das ist wesentlich klarer, genauer und nicht zuletzt auch schneller:
int main() { { char feld[] = { 1, 0, 1, 1, 0, 1, 1, 0 }; int i; int erg = 0; for (i = 0; i < 8; ++i) { // für 3l33t: erg |= (feld[i] << (7 - i)); if (feld[i] == 1) erg = erg | (1 << (7 - i)); } printf("%d\n", erg); return 0; }
-
manchmal sieht man halt den Wald vor lauter Bäumen nicht
Ich danke euch.VG, larsen