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

J'ai avoir le code:Comment normaliser la variable Integer à négative positive ou nulle avec des opérations de bits

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

mais est-il possible d'éviter la division et de le rendre plus rapide?

+0

'abs',' division' et 'addition' sur les entiers sont des instructions natives du processeur. Ils sont très susceptibles d'être beaucoup plus rapides que n'importe quel code de branchement. Vous devrez comparer et comparer – Alexander

+0

Les premiers tests ont montré que l'instruction multiniveau if else fonctionne environ 4 fois plus vite ... –

+0

Utilisez l'opérateur de division non sécurisé et l'opérateur d'ajout non sécurisé. Cela supprimera 2 branches – Alexander

Répondre

0

L'idée était d'utiliser des opérations de bits pour éviter le code de branchement ou la valeur de conversion. n'avez pas trouvé comment faire avec les opérations de bits, mais la pomme déjà ajouter cette fonction

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. 

si simple) Test brut montre ~ x100 plus rapidement mise en œuvre

1

Que diriez-vous

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

Nitpick mineur: il est beaucoup plus probable qu'une valeur est non nulle que zéro (bien sûr, cela dépend de l'ensemble de données). Donc, si la performance est cruciale, alors vous pouvez faire '0 x? 1: (x <0?: -1: 0) '. Le premier serait meilleur si l'on s'attendait à ce que les nombres positifs soient les plus fréquents, et le dernier serait meilleur si l'on s'attendait à ce que les nombres négatifs soient les plus fréquents. Dans tous les cas cependant, je soupçonne que cette ramification serait plus lente que le code sans branches OP est mécontent de – Alexander