Forum: PC-Programmierung Funktion zum Bits extrahieren


von Da Mo (Gast)


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!

von Mike M. (mikeii)


Lesenswert?

if((data & 0b11000000) == 0b11000000) ?

von Da Mo (Gast)


Lesenswert?

Was meinst du damit?

von Mike M. (mikeii)


Lesenswert?

Bitweißes Und auf dein Data Byte, so bleiben nur noch bit 7 und 6 Übrig.
Dann vergleiche ich ob bit 7 und 6 auch 1 1 sind

von Mike M. (mikeii)


Lesenswert?

if((data & 0b11000000) == 0b11000000)
   return 0;

von Peter II (Gast)


Lesenswert?

Do Ma schrieb:
> if(data & 0x01)
>  {
>   return data = data << 4;
>  }

diese abfrage ist falsch wenn sie reagiert auf 01 und 11.

von BubbleJoe (Gast)


Lesenswert?

Er maskiert die ersten beiden Bits aus dem Wort und schaut, ob diese 1 
sind.

von Mike M. (mikeii)


Lesenswert?

Genau, aber die abfrage ob das gesammte wahr ist, ist falsch, wie Peter 
schon sagt.

Aber ich sehe grad, du willst bit 1 und 0

if((data & 0b11) == 0b11)
   return 0;

Analog dazu:


else if((data & 0b01) == 0b01)



else if((data & 0b10) == 0b10)

else...

von Mike M. (mikeii)


Lesenswert?

Und dir ist klar, dass du data damit überschreibst?

return data = data >> 4;

wenn du nur die Bits haben willst, dann so

return data >> 4;

von Da Mo (Gast)


Lesenswert?

Mit der Schreibweise 0b10 kann ich noch nichts anfangen!?

von Mike M. (mikeii)


Lesenswert?

0x bla -> bla hexadezimal codiert
0b bla -> bla binär codiert
0 bla -> bla octal codiert
bla    -> bla dezimal codiert

0b10 = 2 = 0x2

von Da Mo (Gast)


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
}

von Da Mo (Gast)


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
 }

von Mike M. (mikeii)


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.

von Da Mo (Gast)


Lesenswert?

Mein Compiler, kennt diese Schreibweise 0b.. nicht.

von Mike M. (mikeii)


Lesenswert?

Welchen nutzt du?
Und darf man Fragen warum du diese Aufgabe bearbeiten musst? Studierst 
du?

von Da Mo (Gast)


Lesenswert?

Ich verwende Dev-C++.

Es handelt sich um eine Aufgabe für die Schule.

von Werner (Gast)


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

von Mike M. (mikeii)


Lesenswert?

hat Dev-C++ nich auch GCC ? Das sollte einwandfrei funktionieren?

von Da Mo (Gast)


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?

von Mike M. (mikeii)


Lesenswert?

switch kann nur werte vergleichen, das geht damit nur mit umständen.
Was spricht gegen die if Anweisungen?

von Da Mo (Gast)


Lesenswert?

Wenn ich eine Umsetztung mit if-Anweisungn mache, dann muss ich mich an 
diese Reihenfolge halten.

Ich habe an eine Umsetztung gedacht, wo die Reihenfolge gleichgültig 
ist.

von Mike M. (mikeii)


Lesenswert?

1
if((data & 0b11) == 0b01) 
2
     return data << 4;
3
if((data & 0b11) == 0b10)
4
     return  data >> 4;
5
if((data & 0b11) == 0b11)
6
     return  0;
7
if((data & 0b11) == 0b00)
8
     return  0;

von mario (Gast)


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
}

von Mike M. (mikeii)


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

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
Noch kein Account? Hier anmelden.