Bits eines Bytes abgleichen

Guten Abend zusammen,

mein Problemchen:

//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:

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 :slight_smile:

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

(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 :slight_smile:

Hi

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

MfG

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.

if( (wert1 & maske) && (wert2 & maske) ) {

Testsketch:

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();
}

Guten Abend,

Doc_Arduino:
Der ganze Zauber ist nur dieser Syntax.

if( (wert1 & maske) && (wert2 & maske) ) {

Ist auch eine schoene Variante, jedoch brauche ich keinen Vergleich zweier Werte auf eine Bitstelle.
Bei mir reicht die Abfrage eines Bits von einem Byte:

digitalWrite(einPin, ((Testbyte >> Bitstelle) & 0B01));
(selbiges macht ja auch bitRead())

ich danke Dir
grillgemuese :slight_smile:

Hallo,

okay, ich bezog mich auf die Eingangsfrage ein Bit von zwei Bytes zuvergleichen. Egal, bestimmt nur ein Missverständnis. Alles gut. :slight_smile: