Hallo Leute, hat einer eine Idee wie ich ein unsigned char in ein integer umwandeln kann. Ich möchte folgendes tun: In einem unsigned char ist folgendes Bitmuster enthalten 00010001. Wie kann ich das am besten in ein integer umwandeln welches 11 enthält. Hab schon einwenig rumprobiert und versucht im Forum eine Lösung zu finden, aber kein Ergebniss bis jetzt. Vielleicht habt ihr eine Idee. Gruß Andreas
> hat einer eine Idee wie ich ein unsigned char in ein integer umwandeln > kann.
1 | unsigned char c; |
2 | int i; |
3 | i = c; |
> Ich möchte folgendes tun: > In einem unsigned char ist folgendes Bitmuster enthalten 00010001. > > Wie kann ich das am besten in ein integer umwandeln welches 11 enthält. Warum sollte das denn 11 enthalten?
Wie kommst Du vom Bitmuster 00010001 auf 11? Das verstehe ich nicht. Bei mir gibt das 17?
Habt recht ich meinte hex. 17 ist aber auch ok. ich versuch das mal, was rolf vorgeschlagen hat.
Du kannst im übrigen dein c auch überall dort benutzen, wo du auch i benuztt. Auch wenn das 'char' heisst, ist es nichts anderes als ein 'kleiner Integer', mit dem man genauso rechnen kann, wie mit jedem anderen int, unsigned int, long, etc. auch.
[scherz] In jedem Integer steckt ein kleiner char, der da raus will **LOL** [/scherz]
Hall leute, ich habe das Programm von Rolf ausprobiert und irgendetwas macht mir da einen Strich durch die Rechnung. Mein Programm sieht folgendermaßen aus:
1 | int test,b; |
2 | unsigned char ucResult; |
3 | unsigned char a = 0b00010001; |
4 | char tMSG_Buffer[20]; |
5 | |
6 | for (b = 0; b < 8; b++) |
7 | {
|
8 | ucResult <<= 1; /* shift in data byte */ |
9 | |
10 | if (PIND & (1 << PIND1)){ |
11 | ucResult = 1; |
12 | Qttemp[i] = '1'; |
13 | }
|
14 | else{ |
15 | ucResult = 0; |
16 | Qttemp[i] = '0'; |
17 | }
|
18 | i++; |
19 | }
|
20 | |
21 | test = ucResult; |
22 | sprintf(tMSG_Buffer, "\n\r%d\n\r",test); |
23 | at128_sys_func_uart_write_string(tMSG_Buffer); |
24 | |
25 | test = a; |
26 | sprintf(tMSG_Buffer, "\n\r%d\n\r",test); |
27 | at128_sys_func_uart_write_string(tMSG_Buffer); |
28 | |
29 | sprintf(tMSG_Buffer, "\n\r"); |
30 | at128_sys_func_uart_write_string(tMSG_Buffer); |
31 | |
32 | return 0; |
Ergebnis: 1 17 Warum wird mir erst 1 und dann 17 ausgegeben? Bin eigentlich sicher das in ucResult das gleiche drin steht. Wie kann ich mir das bitmuster von ucResult schnellstmöglich ausgeben lassen?
> Bin eigentlich sicher das > in ucResult das gleiche drin steht. Ich nicht. for (b = 0; b < 8; b++) { ucResult <<= 1; /* shift in data byte */ if (PIND & (1 << PIND1)){ ucResult = 1; Qttemp[i] = '1'; } else{ ucResult = 0; Qttemp[i] = '0'; } i++; } darasu folgt doch das in ucResult nur eine 0 oder eine 1 stehen kann
Was du eigentlich haben möchtest:
1 | if (PIND & (1 << PIND1)){ |
2 | ucResult |= 1; |
3 | Qttemp[i] = '1'; |
4 | }
|
5 | else{ |
6 | Qttemp[i] = '0'; |
7 | }
|
Du hast ja recht. Mein Fehler. Richtig muss es ja heißen:
1 | for (b = 0; b < 8; b++) |
2 | {
|
3 | ucResult <<= 1; /* shift in data byte */ |
4 | |
5 | if (PIND & (1 << PIND1)){ |
6 | ucResult |= 1; |
7 | Qttemp[i] = '1'; |
8 | }
|
9 | else{ |
10 | ucResult |= 0; |
11 | Qttemp[i] = '0'; |
12 | }
|
13 | i++; |
14 | }
|
Dann gibt der auch 17 aus. Danke euch für den Denkanstoß.
was macht ihr denn? Wenn ich das richtig verstehe hat er zwei bcd zahlen in einem Byte was spricht gegen uint8 bcd = 0b00010001; uint8 binaer = ((bcd>>8)*10) + (bcd&0xF)
Mal noch ne neue Frage. Wo wir gerade beisammen sind. Wenn ich dieses unsigned char in zwei teile teilen möchte wie machich das am besten. Beispiel: unsigned char a = 0b01110111; unsigned char b, c; teilen in b = 00000111 und c = 00000111 Habt ihr da eine Idee?
Andreas Müller schrieb: > Mal noch ne neue Frage. Wo wir gerade beisammen sind. > > Wenn ich dieses unsigned char in zwei teile teilen möchte wie machich > das am besten. > > Beispiel: > > unsigned char a = 0b01110111; > unsigned char b, c; > > teilen in b = 00000111 und c = 00000111 > > Habt ihr da eine Idee? b = ( a >> 4 ) & 0xFF; // die obere Hälfte c = a & 0xFF; // die untere Hälfte
Hi, ziemlich schlechtes Beispiel was du da gewählt hast(in beiden steht ne 7). Aber ich nehme mal an b soll Low Nipple enthalten und c High Nipple. b = a & 0x0F; c = a >> 4; gruß
Andreas Müller schrieb:
> Das ergibt aber 7 und 64 eigentlich müsste da doch 7 und 7 herauskommen.
Code herzeigen.
Du hast was falsch gemacht.
der Karl heinz hat ein F zu viel im 2 &. das erste & kann ganz wegelassen werden
Andreas Müller schrieb:
> Das ergibt aber 7 und 64 eigentlich müsste da doch 7 und 7 herauskommen.
Der Karl ist noch nit ganz wach (er hat sich sicher verschrieben mit
0xFF meinte er 0x0F). Nimm mein Beispiel das klappt.
gruß
Mea culpa. Ich hab was falsch gemacht. (Man sollte eben nicht gleichzeitig im Forum antworten un dnebenher auch noch seinen eigenen Code debuggen)
Erzähl dochmal, was das ganze überhaupt soll. Intern rechnet die CPU immer binär. Hinschreiben kann man in C Zahlen dezimal, oktal oder hexadezimal. Ausgegeben werden Zahlen in ASCII (Text-LCD) oder 7-Segment. Ein packed BCD braucht man daher nirgends und macht sich mit der Konvertiererei nur selber das Leben schwer. Laß es einfach den C-Compiler so machen, wie es ihm am besten paßt. Peter
da er das zeug von nem Port einließt, dachte ich, dass er zwei BCD ziffern reinbekommt und da einen Int dras machen will, deshalb auch mein Codevorschlag: uint8 binaer = ((bcd>>4)*10) + (bcd&0xF)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.