Fast branchless max für Ganzzahlen ohne Vorzeichen

8

Ich habe einen Trick aus dem AGGREGATE Magic für schnelle Rechenmaxwerte gefunden. Das einzige Problem, dass dies für Ganzzahlen ist, und wie auch immer ich einige Dinge ausprobiert habe, hat keine Ahnung, wie man eine Version für Ganzzahlen ohne Vorzeichen erstellen kann.

%Vor%

Irgendwelche Ratschläge?

BEARBEITEN

Verwenden Sie das nicht, weil es, wie andere sagten, zu undefiniertem Verhalten führt. Für jede moderne Architektur kann der Compiler einen bedingungslosen Verzweigungsbefehl aus return (a > b) ? a : b ausgeben, der schneller als die fragliche Funktion ist.

    
plasmacel 30.07.2013, 12:59
quelle

1 Antwort

9

Was macht dieser Code? Es nimmt den Wert von a und die Differenz a - b . Natürlich ist a - (a - b) b . Und (a - b) >> 31 erstellt einfach eine Maske von Einsen, wenn a - b negativ ist.

Dieser Code ist falsch, wenn Sie einen Überlauf bei der Subtraktion bekommen. Das ist jedoch die gleiche Geschichte wie für unsigned Ganzzahlen. Wenn Sie also damit zufrieden sind, dass Ihr Code nicht für den gesamten Wertebereich korrekt ist, können Sie einfach die Vorzeichen ignorieren und folgendes verwenden:

%Vor%     
cmaster 30.07.2013, 13:14
quelle