Funktion zum Bits extrahieren

Gast #2523979
Lesenswert?
• ▲
▼
Kann mir bitte jemand bei folgender Aufgabenstellung helfen:

Zu erstellen ist eine Funktion, die je nachdem welche Bitkombination auf 
den ersten beiden Bits vorliegt, unterschiedliche Teile eines 
8-bit-Datenwortes extrahiert.

BIT 0-1            Funktionswert
00                 0-Fehler
11                 0-Fehler
01                 unteren 4 Bits (Bits 0-3)
10                 oberen 4 Bits (Bits 4-7)

Das 8-Bit-Datenwort, ist als globaler Parameter zu definieren. Die 
Funktion liefert das Ergebnis als Funktionswert zurück

reslult = get();

Meine ersten Versuche:
1
#include <stdio.h>
2

3
unsigned char data = 0xEE; //Eingabe des 8-Bit-Datenwortes in HEX-Form
4

5
/******************************************************************************/
6
unsigned char get()
7
{
8
        
9
 if(data & 0x01)
10
 {
11
  return data = data << 4;
12
 }
13
 
14
 else if(data & 0x02)
15
 {
16
  return data = data >> 4;
17
 }
18
 
19
 else
20
 {
21
  return 0;
22
 }
23
 
24
}
25

26
void test_1()
27
{
28
 unsigned char erg;
29
 
30
 if(erg = get())
31
 {
32
  printf("0x%X\n\n", erg);      
33
 }  
34
 else
35
 {
36
  printf("error\n\n");
37
 }  
38
 
39
}
40
/******************************************************************************/
41

42
int main(void)
43
{ 
44
 test_1();   
45
      
46
 system ("pause");
47
 
48
 return 0;
49
}
Die Aufgabenstellung 11 funktioniert noch nicht. Wie kann ich diese 
lösen?

VIELEN DANK!
Gast #2524023
Lesenswert?
• ▲
▼
Das ist aber nicht reines C oder?

Folgende Umsetzung, sollte funktionieren!?
1
#include <stdio.h>
2

3
unsigned char data = 0x55; //Eingabe des 8-Bit-Datenwortes in HEX-Form
4

5
/******************************************************************************/
6
unsigned char get()
7
{
8
  
9
 if((data & 0x03) == 0x03)
10
 {
11
  return 0;
12
 }
13
       
14
 if(data & 0x01)
15
 {
16
  return data << 4;
17
 }
18
 
19
 else if(data & 0x02)
20
 {
21
  return data >> 4;
22
 }
23
 
24
 else
25
 {
26
  return 0;
27
 }
28
 
29
}
30

31
void test_1()
32
{
33
 unsigned char erg;
34
 
35
 if(erg = get())
36
 {
37
  printf("0x%X\n\n", erg);      
38
 }  
39
 else
40
 {
41
  printf("error\n\n");
42
 }  
43
 
44
}
45
/******************************************************************************/
46

47
int main(void)
48
{ 
49
 test_1();   
50
      
51
 system ("pause");
52
 
53
 return 0;
54
}
Gast #2524056
Lesenswert?
• ▲
▼
Was genau bedeuten diese Zeilen? Ich habe diesen Abschnitt von einem 
anderen Programm übernommen.
1
void test_1()
2
{
3
 unsigned char erg;
4
 
5
 if(erg = get()) //?????????????????????????????
6
 {
7
  printf("0x%X\n\n", erg);      
8
 }  
9
 else
10
 {
11
  printf("error\n\n");
12
 }
#2524064
Lesenswert?
• ▲
▼
if(erg = get())

erg wird der Rückgabewert von get() zugewiesen.
Ausgewertet wird dieser Wert dann. Alles was verschieden von 0 ist führt 
zu  printf("0x%X\n\n", erg);

Was heißt reines C ? Das macht man nunmal so. Warum schreibst du 0x02 
und nicht nur 2 ? Ist die gleiche Frage

Deine Bitüberprüfung sollte so laufen.
Gast #2524078
Lesenswert?
• ▲
▼
Do Ma schrieb:
> Mit der Schreibweise 0b10 kann ich noch nichts anfangen!?

Die ersten zwei Zeichen ("0b") geben das Zahlensystem an und stehen für 
binär. "10" ist dann die Zahl im Dualsystem.

Andere häufig verwendete Zahlensysteme/Bezeichner
"0x" für Hexadezimalsystem
"0d" für Dezimalsystem
"0o" für Octalsystem
Gast #2524116
Lesenswert?
• ▲
▼
Gibt es eine Möglichkeit, dass ich die ganzen Anweisungen (if, else if, 
else) durcheinander schreibe?

Im aktuellen Programm, ist die umgesetzte Reihenfolge für eine richtige 
Ausführung notwendig.

switch-Funktion?
Gast #2524438
Lesenswert?
• ▲
▼
so würde ich das wahrscheinlich schreiben
1
unsigned char data = 0xEE; //Eingabe des 8-Bit-Datenwortes in HEX-Form
2

3
/******************************************************************************/
4

5
char get()
6
{
7
    char ret = 0;
8

9
// BIT 0-1            Funktionswert
10
// 00                 0-Fehler
11
// 11                 0-Fehler
12
// 01                 unteren 4 Bits (Bits 0-3)
13
// 10                 oberen 4 Bits (Bits 4-7)
14

15
    switch(data & 0x03) {
16
        case 0x01:
17
            ret = data & 0x0F;
18
            break;
19
        case 0x02:
20
            ret = data >> 4;
21
            break;
22
        default:
23
            break;           
24
    }
25

26
    return ret;
27
}
#2524679
Lesenswert?
• ▲
▼
Stimmt, da hatte ich nen Denkfehler bei der Maskierung der Bits -.-

Aber warum extra Variable?
1
char get()
2
{
3

4
// BIT 0-1            Funktionswert
5
// 00                 0-Fehler
6
// 11                 0-Fehler
7
// 01                 unteren 4 Bits (Bits 0-3)
8
// 10                 oberen 4 Bits (Bits 4-7)
9

10
    switch(data & 0x03) {
11
        case 0x01:
12
            return data & 0x0F;
13
            
14
        case 0x02:
15
            return data >> 4;
16
           
17
        default:
18
            return 0;          
19
    }
20

21
    
22
}

wobei man sich das break dann auch sparen kann

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