Wenn Sie diese Methoden häufig aufrufen, ist der schnellste Weg nicht die Bitmanipulation, sondern wahrscheinlich eine Nachschlagetabelle. Definieren Sie für jede Operation ein Array mit der Länge 511. Beispiel für Minus (Subtraktion)
static unsigned char maxTable[511];
memset(maxTable, 0, 255); // If smaller, emulates cutoff at zero
maxTable[255]=0; // If equal - return zero
for (int i=0; i<256; i++)
maxTable[255+i] = i; // If greater - return the difference
Das Array ist statisch und wird nur einmal initialisiert. Jetzt kann Ihre Subtraktion als Inline-Methode oder mithilfe des Pre-Compilers definiert werden:
#define MINUS(A,B) maxTable[A-B+255];
Wie es funktioniert? Nun, Sie möchten alle möglichen Subtraktionen für vorzeichenlose Zeichen vorberechnen. Die Ergebnisse variieren von -255 bis +255, insgesamt 511 verschiedene Ergebnisse. Wir definieren ein Array aller möglichen Ergebnisse, aber da wir in C nicht über negative Indizes darauf zugreifen können, verwenden wir +255 (in [A-B + 255]). Sie können diese Aktion entfernen, indem Sie einen Zeiger auf die Mitte des Arrays definieren.
const unsigned char *result = maxTable+255;
#define MINUS(A,B) result[A-B];
benutze es wie:
bsub = MINUS(13,15); // i.e 13-15 with zero cutoff as requested
Beachten Sie, dass die Ausführung extrem schnell ist. Nur eine Subtraktion und eine Zeiger-Deferenz, um das Ergebnis zu erhalten. Keine Verzweigung. Die statischen Arrays sind sehr kurz, sodass sie vollständig in den CPU-Cache geladen werden, um die Berechnung weiter zu beschleunigen
Das Gleiche würde für die Addition funktionieren, jedoch mit einer etwas anderen Tabelle (die ersten 256 Elemente sind die Indizes und die letzten 255 Elemente sind gleich 255, um den Cutoff über 255 hinaus zu emulieren.
Wenn Sie auf einer Bitoperation bestehen, sind die Antworten, die (a> b) verwenden, falsch. Dies kann weiterhin als Verzweigung implementiert werden. Verwenden Sie die Vorzeichen-Bit-Technik
// (num1>num2) ? 1 : 0
#define is_int_biggerNotEqual( num1,num2) ((((__int32)((num2)-(num1)))&0x80000000)>>31)
Jetzt können Sie es zur Berechnung der Subtraktion und Addition verwenden.
Wenn Sie die Funktionen max (), min () ohne Verzweigung emulieren möchten, verwenden Sie:
inline __int32 MIN_INT(__int32 x, __int32 y){ __int32 d=x-y; return y+(d&(d>>31)); }
inline __int32 MAX_INT(__int32 x, __int32 y){ __int32 d=x-y; return x-(d&(d>>31)); }
Meine obigen Beispiele verwenden 32-Bit-Ganzzahlen. Sie können es in 64 ändern, obwohl ich glaube, dass 32-Bit-Berechnungen etwas schneller ablaufen. Wie du willst
y ^ ((x ^ y) & -(x < y))
fürint
Typen wirdmin(x, y)
ohne Verzweigung ausgewertet . Dies könnte Teil einer möglichen Lösung sein, basierend auf dem, was Sie bisher haben.