Forum: Mikrocontroller und Digitale Elektronik Frage zum Bit Schieben und Biterkennung


von Thorsten (Gast)


Lesenswert?

Hallo an alle,

ich habe ein Problem mit dem Hin- und Herschieben von Bits. Habe ich 
scheinbar noch nicht ganz verstanden.

Ich habe einen Wert per #define angegeben. Beim Aufruf einer Funktion 
übergebe ich diesen Wert an die Funktion. Die Daten der Variablen möchte 
ich nun Bit für Bit abrufen und abfragen, ob das jeweilige Bit 0 oder 1 
ist.

Hier mal etwas Code
1
#define DATENSATZ 100
2
3
CallFunction(DATENSATZ);
4
5
void CallFunction(uint32_t daten)
6
{
7
    for(k=0;k<32;k++)
8
    {
9
        if(daten & 0x80000000)
10
      // Do something
11
  else
12
      // Do something else  
13
  daten <<= 1;
14
    }
15
}

Das Funktioniert auch soweit.
Ich habe jetzt folgendes Problem, dass ich teilweise nicht alle Bits 
überprüfen möchte, sondern nur die letzen z.B. 20.
Also habe ich mir gedacht, ich schiebe dann vor der For-Schleife die 
Daten 12 Schritte nach links und überprüfe die Daten. Dabei veränder ich 
dann natürlich die Bedingung i<32.

Vielleicht mal ein Beispiel:
1
#define 699594 // bin: 10101010110011001010
2
k= 0;
3
k= 32-laenge;    // laeng = 20
4
data <<= k;
5
6
 for(k=0;k<laenge;k++)
7
    {
8
        if(daten & 0x80000000)
9
      // Do something
10
  else
11
      // Do something else  
12
  daten <<= 1;
13
    }

Leider funktioniert das nicht so richtig. Ich bekomme dann nicht die 
Daten, die ich erwarte.
Ich habe z.B. Daten die 28 Bit Lang sind und welche mit 19 
Bit.Komischerweise funktioniert das Ganze mit den 28 Bit langen Daten 
aber nicht mit den 19 Bit Daten.

Hat jemand eine Idee, was ich da falsch mache? BZW. gibt es einen 
eleganteren Weg?

Später möchte ich das ganze eventuell dazu nutzen, einen Port 
entsprechend der Daten zu toggeln.
Ich hoffe, ich konnte das Problem einigermaßen darstellen.

Gruß
Thorsten

von Markus (Gast)


Lesenswert?

Hi,
1
#include <stdio.h>
2
3
void func1( unsigned int value, int laenge)
4
{
5
  int k = 32 - laenge;
6
7
  value <<= k;
8
9
  for( k = 0; k < laenge; k++)
10
  {
11
    if( value & 0x80000000)
12
      printf( "1");
13
    else
14
      printf( "0");
15
16
    value <<= 1;
17
  }
18
  
19
  printf( "\n");
20
}
21
22
void func2( unsigned int value, int laenge)
23
{
24
  int k;
25
  
26
  for( k = laenge-1; k >= 0; k--)
27
  {
28
    if( value & 1 << k)
29
      printf( "1");
30
    else
31
      printf( "0");
32
  }
33
  
34
  printf( "\n");
35
}
36
37
int main( int argc, char *argv[])
38
{
39
  func1( 0b11111111110010111010, 19);
40
  func2( 0b11111111110010111010, 19);
41
  
42
  return 0;
43
}

Beide funcs funktionieren, die zweite finde ich huebscher.

Gruesse, Markus

von Markus (Gast)


Lesenswert?

Ach ja, ints sind bei mir grad 32 bit lang.

von Thorsten (Gast)


Lesenswert?

Hallo,

vielen Dank für die schnelle Antwort! Ich habe bisher die erste Version 
mal getestet. Das scheint schonmal so weit zu funktionieren. Vielen 
Dank.

Werde mir die zweite Version auch mal noch ansehen.


Gruß
Thorsten

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.