Wie kann ich programmgesteuert Rückkehr der max-von zwei ganzen zahlen ohne Verwendung von Vergleichsoperatoren und ohne Verwendung von if, else, etc?
Wie kann ich programmgesteuert Rückkehr der maximal zwei Ganzzahlen ohne Verwendung von Vergleichsoperatoren und ohne Verwendung if
else
usw?
InformationsquelleAutor der Frage MrDatabase | 2008-10-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
max: //setzen MAX(a,b) in einem
Und:
int a, b;
min: //setzen MIN(a,b) in einem
vom hier.
InformationsquelleAutor der Antwort plinth
http://www.graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
Können Sie Spaß haben, überträgt sich rein rechnerisch mit der Verlagerung
(x - y)
zu sättigen das Vorzeichen-bit, aber dies ist in der Regel genug. Oder Sie können testen, die high-bit, immer Spaß.InformationsquelleAutor der Antwort MSN
Ich denke ich habe es.
Würde das nicht funktionieren? Im Grunde, nehmen Sie die Differenz der beiden, und dann wieder der eine oder andere auf der Grundlage der Vorzeichen-bit. (Dies ist, wie der Prozessor wird, größer als oder weniger als eh.) Also, wenn das Vorzeichen-bit 0 ist, die Rückkehr ein, denn a ist größer oder gleich b ist. Wenn das Vorzeichenbit ist 1, return b, weil die Subtraktion von b von a verursacht, das Ergebnis zu gehen negativ, was darauf hinweist, dass b größer war als ein. Stellen Sie sicher, dass Ihre ints sind 32-bit unterzeichnet.
InformationsquelleAutor der Antwort Nicholas Flynt
In die Welt der Mathematik:
Abgesehen davon, dass es mathematisch korrekt ist es nicht, Annahmen über die bit-Größe wie das verschieben von Operationen tun müssen.
|x|
steht für den absoluten Wert von x an.Kommentar:
Du hast Recht, der absolute Wert vergessen wurde. Dies gilt für alle a, b positiv oder negativ
InformationsquelleAutor der Antwort Dimitris
return (a > b ? a : b);
oder
InformationsquelleAutor der Antwort bobwienholt
nicht so pfiffigen wie die oben genannten... aber...
InformationsquelleAutor der Antwort mspmsp
Da dies ein Rätsel, Lösung wird etwas verworren:
Dies ist Haskell, aber es werden die gleichen in jeder anderen Sprache. C/C# - Leute sollten "sgn" (oder "Zeichen"?) anstelle von signum.
Beachten Sie, dass dies funktionieren wird auf Ganzzahlen beliebiger Größe und auf reellen zahlen als gut.
InformationsquelleAutor der Antwort ADEpt
Von z0mbie (bekannten Viren, zum Beispiel Schriftsteller) Artikel "Polymorph-Spiele", vielleicht finden Sie es nützlich:
cheers
InformationsquelleAutor der Antwort Bartosz Wójcik
Dies ist eine Art von Betrug, die Verwendung von Assembler, aber es ist trotzdem interessant:
Wenn Sie möchten, werden streng über die Regeln und sagen, dass die
cmpl
Anleitung illegal ist, dann die folgenden (weniger effizient) - Sequenz:InformationsquelleAutor der Antwort Adam Rosenfield
InformationsquelleAutor der Antwort mkny