7

ich ein Video heute beobachtet und den Mann in dem Video nur das schreiben, zu verstehen, ob eine Zahl gerade oder nicht:etwas zu tun, in einer ungewöhnlichen, aber effiziente Art und Weise

number/2*2 == number ? true : false ; 

ich es versucht, wenn ich nach Hause kam und verglichen mit

number % 2 == 0 ? true : false ; 

war der zweite schneller als ich die erste als geändert:

number>>1<<1 == number ? true : false; 

dieses t Ich habe die Zahl einmal nach rechts und einmal nach links verschoben. D Der Leistungsunterschied ist nicht riesig nur 0-1 Sekunden für die Identifizierung aller Zahlen zwischen 1 und 1000000000, aber ich mochte es sehr und wollte solche Tricks hören von dir.

also was noch? =)

und eine andere Idee von Russell Borogove =)

(number&1) == 0; 

Ergebnisse:

Abgelaufene Zeit mit und Betrieb: 00: 00: 07.0504033
Zeit mit Schichtbetrieb Abgelaufene: 00: 00: 06.4653698
Abgelaufene Zeit mit Mod Operation: 00: 00: 06,8323908

Überraschenderweise Verschiebung zweimal arbeitet schneller als eine einzige und Betrieb auf meinem Computer.

+2

Was ist los mit 'even = (Zahl & 1) == 0'? –

Antwort

7

MIT führt tatsächlich eine Liste solcher Dinge, HAKMEM, die bei http://www.inwap.com/pdp10/hbaker/hakmem/hakmem.html gefunden werden kann. Die meisten programmierbezogenen sind in Assembler geschrieben, aber ich verstehe, dass einige von ihnen in C unter http://graphics.stanford.edu/~seander/bithacks.html übersetzt wurden.

Jetzt für einen Vortrag: Diese schmutzigen Tricks könnten schneller sein, aber es dauert viel zu lange, um es zu verstehen.

Die meisten Computer sind nicht so leistungskritisch, dass Tricks wie diese notwendig sind. Im ungerade-gerade Fall ist number % 2 == 0 viel klarer und lesbarer als number/2*2 == number oder number>>1<<1 == number. Das heißt, in normalen Anwendungen sollten Sie immer die einfachere und mehr Standard-Option verwenden, da dies Ihren Code einfacher zu verstehen und zu pflegen macht.

Es gibt jedoch Anwendungsfälle für Tricks wie diese. Vor allem in großen mathematischen oder wissenschaftlichen Computer- und Computergrafiken können Tricks wie diese Ihr Leben retten. Ein hervorragendes Beispiel dafür ist John Carmack's "magic inverse square root" in Quake 3.

+0

Einige dieser Tricks sind tatsächlich sehr nützlich, wenn Sie in der Assembly für Mikrocontroller programmieren, wenn Sie mit einem begrenzten Befehlssatz und nur mit so vielen Zyklen arbeiten. In höheren Programmiersprachen sind sie jedoch normalerweise nicht notwendig, da Compiler normalerweise gute Arbeit leisten, um sie zu optimieren. –

+0

@Insilico: Absolut, obwohl sie in der Mainstream-Programmierung jedoch selten notwendig sind. –

+3

+1 für die magische Quadratwurzel q3 :) –

1

Das Buch Hacker's Delight ist 300 Seiten von nichts als Zeug wie diese. Es ist nicht billig, aber es ist eine Bit-Twiddler-Bibel.

Verwandte Themen