Go Down

Topic: Bits eines Bytes abgleichen (Read 88 times) previous topic - next topic

grillgemuese

Guten Abend zusammen,

mein Problemchen:
Code: [Select]
//digitalWrite(p[ip], bitRead(step_mask[dvar][st], ip)); //funktioniert
//digitalWrite(p[ip], constrain(step_mask[dvar][st] & 1 << ip, 0, 1)); //funktioniert
digitalWrite(p[ip], (step_mask[dvar][st] & 1 << ip)); //gibt den Wert des Bytes zurueck :(


Meine Frage:
Wie kann ich ein bit eines byte's mit einem anderem bit eines byte's vegleichen ohne dabei den
zusammengefuehrten Wert zu erhalten?
Bsp:
Code: [Select]
0B00000011 (step_mask[...][...])
0B00000010 (1 << 1)
----------- ==
0B00000010
ich moechte nun aber nicht das Ergebnis 0B10 sondern nur den zustand WAHR wenn das abgefragte Bit uebereinstimmt.


Ich danke Euch
grillgemuese :)

postmaster-ino

Hi

(var && 1<<bitnummer)
So was?
var ist Deine Variable, in Der Du die Bits prüfen möchtest.
bitnummer ist die Nummer des zu Prüfenden Bit, ACHTUNG, Zählung beginnt bei Null! (also 0...7)
Das << schiebt die 1 so viele Stellen nach links, wie bitnummer angibt - somit ist
bitnummer 0 -> 1
bitnummer 1 -> 2
bitnummer 2 -> 4
...
bitnummer 7 -> 128

MfG

grillgemuese

#2
May 24, 2018, 10:03 pm Last Edit: May 24, 2018, 10:14 pm by grillgemuese
(var && 1<<bitnummer)

das funktioniert in meinem Fall nicht.

wenn ich z.B.: (0B00000011 && 1 << 0)
vergleiche komme ich auf 0, da mit && das gesamte byte verglichen wird.

naechster Gedanke war es die 0B00000011 um bitnummer >> zu verschiebenund nur auf bit0 pruefen.
Da ensteht aber das Problem, wenn ich bit0 abfrage und in den anderen bit noch etwas steht.
Das koennte man mit einem << und >> geschiebe loesen, aber da gefaellt mit die bitRead() version besser.


NEW
hab gerade die org. bitRead() Funktion/makro gefunden:
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
digitalWrite(p[ip], ((step_mask[dvar][st] >> ip) & 0B01));

ich danke Dir
grillgemuese :)

postmaster-ino

Hi

Arrg ... & <-> && (bitweises und logisches AND)
Aber wo Du Das jetzt gefunden hast, das Makro kam mir auch schon Mal unter ...

MfG

Doc_Arduino

Hallo,

ich greife das nochmal auf wegen dem Verständnis was du eigentlich machen und vergleichen wolltest.
Vielleicht hilft dir das irgendwann nochmal.
Der ganze Zauber ist nur dieser Syntax.
Code: [Select]
if( (wert1 & maske) && (wert2 & maske) ) {

Testsketch:
Code: [Select]
byte wert1 = 24;
byte wert2 = 45;
byte maske = (1<<3);  // auf das 3. Bit soll geprüft werden

void setup()  {
  Serial.begin(9600);

  formatiere_Byte (wert1);
  formatiere_Byte (wert2);
  formatiere_Byte (maske);
  Serial.println();

  for (; wert1 < 250; wert1++){
    if( (wert1 & maske) && (wert2 & maske) ) {
      Serial.println(F("3. Bit gleich"));
      formatiere_Byte (wert1);
      formatiere_Byte (wert2);
      Serial.println();
    }
  }
    
}
  


void loop() {

}


// ****** Funktionen ******* //

void formatiere_Byte (byte data)
{
  Serial.print(F("data: "));
  for (char i=7;i>=0;i--) {
    Serial.print(bitRead(data,i));
  }
  Serial.println();
}  



Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up