Ich arbeite gerade an einem Projekt, in dem ich Bit-Sets brauche. Ich verwende ein Array von uint64_t
für das Bitset.C - BitArray - Setze ein einzelnes Bit von uint64_t
Mein aktuelles Problem ist, dass, wenn ich festlegen möchten oder etwas überprüfen Ich brauche eine Operation wie dies zu tun:
uint64_t index = 42;
bArr[index/64] |= (((uint64_t)1)<<(index%64));
ich die Abteilung neu schreiben kann und Modulo mit einigen cleveren und und Bitshift Operationen als auch, aber ich bin besorgt über die Besetzung von 1
. Ich brauche diese Besetzung, da sonst die 1
als 32-Bit-Einheit gesehen wird. Wie in diesem Beispiel gesehen - erhalten Sie falsche Ausgabe ohne Guss:
uint64_t bArr[4]; // 256 bits
bArr[0] = bArr[1] = bArr[2] = bArr[3] = 0; // Set to 0
uint64_t i = 255;
bArr[i/64] = (bArr[i/64] | (((uint64_t)1)<<(i%64)));
uint32_t i2;
for (i2 = 0; i2 < 256; i2++) {
if ((bArr[i2/64] & (((uint64_t)1)<<(i2%64))) != 0) {
printf("bArray[%" PRIu32 "] = 1\n", i2);
}
}
Kann ich um diese Besetzung in einem cleveren Weg? Ich dachte, dass die Leistung wahrscheinlich von einer Besetzung bei alle lesen/schreiben ...
Do * not * die Division und modulo neu schreiben, um "clever" zu sein; Der Compiler ist sicherlich clever genug, um diese Optimierungen bereits für Sie durchzuführen. Denken Sie auch daran, 'CHAR_BIT * sizeof bArr [0]' anstelle von '64' zu verwenden, um magische Zahlen zu vermeiden. – unwind
@unwind Danke für den Tipp. Ich werde es mit meinem Code testen. Dies ist jedoch wahrscheinlich der Fall. – Matthias
Wenn Sie nach Geschwindigkeit suchen, stellen Sie eine Tabelle "const uint64_t" mit den 64 verschiedenen ULL-Konstanten (1 an allen möglichen Stellen vorverschoben) zur Verfügung und indizieren Sie diese. – tofro