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