char in integer

OP #1370783
Lesenswert?

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
Gast #1370788
Lesenswert?

> 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?
OP #1370843
Lesenswert?

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?
Gast #1370852
Lesenswert?

> 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
OP #1370880
Lesenswert?

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ß.
#1370922
Lesenswert?

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
#1370957
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren