Forum: Mikrocontroller und Digitale Elektronik Bitmanipulation Verständnisfrage


von Nico G. (Gast)


Lesenswert?

Guten morgen zusammen,

ich habe mal ne Frage bezüglich der Bitmanipulation. Bin noch Anfänger 
desshalb verzeiht mir die Frage.

Ich möchte im Prinzip immer ein Bit einlesen und dann aneinander reihen 
in einem Byte Wenn ich das wie unten aufgeführt mache ist dann davon 
auszugehen das die Bits aneinander gereiht werden oder schon beim 2. 
Durchlauf der Schleife das MSB nach vorne hinaus geschoben wird?

Muss ich das eventuell mit einer Oder verknüpfung realisieren?


for(k = 7; k >= 0; k--)//Herunterzählen der Variable k von 7 bis 0
{
   einlesebyte = einlesebit<<k;
}

Danke schonmal für eure Hilfe.

von astroscout (Gast)


Lesenswert?

Nico G. schrieb:
> einlesebyte = einlesebit<<k;

Damit wird einlesebyte in jedem Schleifendurchlauf neu definiert, sodass 
du immer nur das aktuelle einlesebit verschoben um k in einlesebyte 
hast.

Guck dir zum Thema Bitmanipulation mal folgendes an:
http://www.mikrocontroller.net/articles/Bitmanipulation

Im Prinzip kannst du einlesebyte mit Null initialisiren und dann die 
verschobenen Einlesebits oder-Verknüpfen

von Karl H. (kbuchegg)


Lesenswert?

Ich kann dir nur raten:spiel die Operationen mal auf dem Papier durch!
Dein Verstädnnis dafür, was passiert, wenn du Code siehst, wird einen 
großen Schritt nach vorne machen.

Es ist wirklich nicht schwer: Spiel Computer und arbeite dein 'Programm' 
ab. Mach genau das, was dort steht, nicht was du denkst was passieren 
müsste, sondern das was auf dem Papier steht. Variablen 'simulierst' du, 
indem du ihre Werte auf Papier festhältst und sie entsprechend 
veränderst.

Und nein, schmunzle nicht darüber. Das ist tatsächlich und ernsthaft 
eine exzellente Methode, wie man sich klar macht, was genau ein 
bestimmmter Code für Auswirkungen hat und was er tut.

von Matthias L. (Gast)


Lesenswert?

> k >= 0;

DIese Bedingung ist immer erfüllt, wenn Du ein uint dafür verwendest.
1
uint8_t  u8Mask   = 0x80;
2
uint8_t  u8Result = 0x00;
3
4
while ( u8Mask != 0 )
5
{
6
  if ( einlesebit ist gesetzt )
7
  {
8
    u8Result |= u8Mask;
9
  }
10
11
  u8Mask = (u8Mask >> 1);
12
}

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.