INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
64Bit Variable?
03.02.2021, 14:28
Beitrag #17
RE: 64Bit Variable?
So, ich habe mal schnell für beliebig lange BitArrays die grundlegenden bitweisen Verknüpfungsfunktionen gebaut.

Code:
const byte anzBit = 128;  // Anzahl der Bits

constexpr byte anzByte = (anzBit / 8) + ((anzBit % 8) ? 1 : 0); // resultierende Anzahl der Bytes (Berechnung zur Compilezeit!)

byte bitArray1[anzByte]; // Bytearray als Speicher
byte bitArray2[anzByte];
byte bitArrayRes[anzByte];

// Hilfsfunktion Byte binär mit führenden 0en ausgeben
// p = ein Nachfahre von Printer (z.B. Serial, SoftwareSerial, manche LCD)
// b das Byte
void printByteBin(Print &p, byte b) {
  char arr[] = "00000000";
  byte bit;
  for(byte i=0;i<8;i++) {
    bit = b & 0x1;
    arr[7-i]=bit + 0x30;
    b = b >> 1;
  }
  p.print(arr);
}

// Hilfsfunktion Array binär ausgeben
// p = ein Nachfahre von Printer (z.B. Serial oder SoftwareSerial)
// *b das Array
// len die Länge in Bytes
void printArray(Print &p, const byte *b, const byte len) {
  for(byte i=0;i<len;i++) {
    printByteBin(p,b[len-i-1]);
    p.print(" ");
  }
  p.println();
}

// setzt das Bit an Position idx auf den Wert val
void setBit(byte *b, const byte idx, const bool val) {
  if (idx >= anzBit ) return;  // Bereichsüberschreitung
  bitWrite(b[idx/8],idx%8,val);
}

// Liest den Wert des Bits an der Position idx
bool readBit(byte *b, const byte idx) {
  return bitRead(b[idx/8],idx%8);
}

// bitweises OR
byte *bitArrOr(byte *res, const byte *b1, const byte *b2) {
  for(byte i=0;i < anzByte; i++) {
    res[i] = b1[i] | b2[i];
  }
  return res;
}

// bittweises AND
byte *bitArrAnd(byte *res, const byte *b1, const byte *b2) {
  for(byte i=0;i < anzByte; i++) {
    res[i] = b1[i] & b2[i];
  }
  return res;
}

// bittweises XOR
byte *bitArrXor(byte *res, const byte *b1, const byte *b2) {
  for(byte i=0;i < anzByte; i++) {
    res[i] = b1[i] ^ b2[i];
  }
  return res;
}

// bitweise Negation
byte *bitArrNot(byte *res, const byte *b1) {
  for(byte i=0;i < anzByte; i++) {
    res[i] = ~b1[i] ;
  }
  return res;
}


void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  setBit(bitArray1,121,1);
  setBit(bitArray1,120,1);
  setBit(bitArray2,121,1);
  setBit(bitArray2,120,0);
  Serial.println(readBit(bitArray1,121));
  printArray(Serial, bitArray1, anzByte);
  printArray(Serial, bitArray2, anzByte);
  Serial.println("OR:  ");
  printArray(Serial,bitArrOr(bitArrayRes, bitArray1,bitArray2),anzByte);
  Serial.println("AND: ");
  printArray(Serial,bitArrAnd(bitArrayRes, bitArray1,bitArray2),anzByte);
  Serial.println("XOR: ");
  printArray(Serial,bitArrXor(bitArrayRes, bitArray1,bitArray2),anzByte);
  Serial.println("NOT: ");
  printArray(Serial,bitArrNot(bitArrayRes, bitArray1),anzByte);
}

void loop() {}

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.02.2021, 16:07
Beitrag #18
RE: 64Bit Variable?
Cool !

Vielleicht kannst Du das ja auch in die Lib mit einbauen, damit man die Befehle komfortabler benutzen kann?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.02.2021, 16:17
Beitrag #19
RE: 64Bit Variable?
Nö, die sind doch komfortabel genug. Wer mehr will, kann es ja selbst umbauen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  * vor Variable / Code-Frage N1d45 6 203 13.04.2021 19:49
Letzter Beitrag: N1d45
  Variable in for-Schleife volllaufen lassen. gutschy 7 260 09.04.2021 17:54
Letzter Beitrag: Tommy56
  Variable über serielle Eingabe befüllen ? Foto-Ralf 23 1.876 21.11.2020 11:23
Letzter Beitrag: Tommy56
  Erläuterung zu "digitalWrite(PIN, Variable ? LOW : HIGH); " Christian_Moba-Arduino 14 1.367 09.10.2020 08:53
Letzter Beitrag: hotsystems
  HC-12 verschiede Variable übertragen Harry 33 11.841 21.06.2020 20:09
Letzter Beitrag: Tommy56
Photo SIM800l Variable Telefonnummer zuweisen huber5093 18 2.345 15.06.2020 23:07
Letzter Beitrag: georg01
  Variable mit Werten von SD-Karte füllen DO3GE 16 2.384 14.04.2020 19:38
Letzter Beitrag: Corvus
  Merkwürdiges Verhalten einer globalen Variable Anders_Hamburg 6 1.139 29.03.2020 10:46
Letzter Beitrag: Fips
  8 Bit als Variable Parallel einlesen Holzauge 4 1.995 24.03.2020 20:18
Letzter Beitrag: Holzauge
  variable or field declared void Harry 10 2.705 21.02.2020 22:54
Letzter Beitrag: MicroBahner

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste