2017-03-10 3 views
0
7 -> 1 
0 -> 0 
-7 -> -1 

Ich habe habe Code zu normalisieren:Wie Integer-Variable positiv negativ oder Null-Bit-Operationen

(x == 0 ? 0 : x/abs(x)) + 1 

aber ist es möglich, Teilung zu vermeiden und es schneller machen?

+0

'abs',' division' und "Addition" auf Ganzzahlen sind native Prozessoranweisungen. Sie sind sehr wahrscheinlich viel schneller als jede Art von Verzweigungscode. Sie müssen vergleichen und vergleichen – Alexander

+0

Erste Tests haben gezeigt, dass die mehrstufige if else-Anweisung ungefähr 4 mal schneller funktioniert ... –

+0

Verwenden Sie den unsicheren Divisionsoperator und den unsicheren add-Operator. Das wird 2 Zweige entfernen – Alexander

Antwort

0

Die Idee war, Bit-Operationen zu verwenden Verzweigungscode oder Wertumwandlung zu vermeiden. Haben Sie nicht gefunden, wie es mit Bit-Operationen zu tun, aber Apple diese Funktion bereits

https://developer.apple.com/documentation/swift/int/2886673-signum

signum() 
Returns -1 if this value is negative and 1 if it’s positive; otherwise, 0. 

so einfach) Roh-Test zeigt ~ x100 schnellere Implementierung hinzufügen

1

Wie wäre es

(x == 0 ? 0 : (x < 0 ? -1 : 1)) 
+1

Kleiner Nitpick: Es ist viel wahrscheinlicher, dass ein Wert ungleich Null ist (natürlich hängt das vom Datensatz ab). Wenn also die Leistung entscheidend ist, könnten Sie '0 x? 1: (x <0?: -1: 0) '. Ersteres wäre besser, wenn man davon ausginge, dass positive Zahlen am häufigsten vorkommen, und Letzteres wäre besser, wenn man davon ausgeht, dass die negativen Zahlen am häufigsten sind. In jedem Fall vermute ich, dass diese Verzweigung langsamer sein würde als der verzweigungsfreie Code, über den OP unzufrieden ist – Alexander

Verwandte Themen