Comment est-ce que je retourne par programme le maximum de deux nombres entiers sans employer aucun opérateur de comparaison et sans employer si, autrement, etc.?
Comment puis-je renvoyer par programmation le maximum de deux entiers sans l'aide de tous les opérateurs de comparaison et sans l'aide de if
else
etc?
source d'informationauteur MrDatabase
Vous devez vous connecter pour publier un commentaire.
max: //mettrai MAX(a,b) dans un
Et:
int a, b;
min: //Va mettre MIN(a,b) dans un
de ici.
http://www.graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
Vous pouvez vous amuser avec arithmétiquement déplacement
(x - y)
pour saturer le bit de signe, mais ce qui est généralement suffisant. Ou vous pouvez tester le bit élevé, toujours amusant.Je pense que je l'ai.
Ne serait-ce pas le travail? Fondamentalement, vous prenez la différence entre les deux, et ensuite de retour à l'un ou l'autre basé sur le bit de signe. (C'est la façon dont le processeur n'est plus grand ou plus petit que, de toute façon.) Donc, si le bit de signe est 0, retour a, puisque a est plus grand ou égal à b. Si le bit de signe est à 1, le retour de b, parce que la soustraction b à partir d'un causés en sorte que le résultat négatif, ce qui montre que b est supérieure à un. Assurez-vous que votre ints sont 32bits signé.
Dans les mathématiques monde:
En plus d'être mathématiquement correct, il n'est pas de faire des hypothèses sur la taille en bits comme le déplacement des opérations besoin de le faire.
|x|
représente la valeur absolue de x.Commentaire:
Vous avez raison, la valeur absolue a été oublié. Cela devrait être valable pour tous a, b positif ou négatif
retour (a > b ? a : b);
ou
pas comme snazzy comme ci-dessus... mais...
Depuis, c'est un puzzle, la solution sera un peu alambiquée:
C'est Haskell, mais ce sera la même chose dans une autre langue. C/C# les gens devraient utiliser "sgn" (ou "signe"?) au lieu de signum.
Notez que cela fonctionnera sur des entiers de taille arbitraire et sur les réels.
De z0mbie (célèbre virus tel écrivain) article "Polymorphe Jeux", peut-être que vous le trouverez utile:
acclamations
C'est de la triche, à l'aide de l'assemblée de la langue, mais il est néanmoins intéressants:
Si vous voulez être strict sur les règles et dire que le
cmpl
instruction est illégal pour cela, alors la suite (la moins efficace) séquence de travail: