Frage zum Bit Schieben und Biterkennung

Gast #3799921
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
Gast #3800074
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
Gast #3805870
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.