Ich spreche darüber:
Wenn wir den Buchstaben 'A' haben, der 77 in Dezimal und 4D in Hex ist. Ich suche den schnellsten Weg um D zu bekommen.
Ich habe über zwei Wege nachgedacht:
Gegeben sei x ein Byte.
x & lt; & lt; 4; x & gt; & gt; 4
x% = 16
Irgendwelche anderen Möglichkeiten? Welcher ist schneller?
Danke.
Die Kürze ist schön - Erklärungen sind besser:)
x &= 0x0f
ist natürlich die richtige Antwort. Es drückt genau die Absicht dessen aus, was Sie erreichen wollen und wird bei jeder vernünftigen Architektur immer auf die minimale Anzahl von Anweisungen kompilieren (d. H. 1). Verwenden Sie hexadezimal anstatt dezimal, wenn Sie Konstanten in einen bitweisen Operator setzen.
x <<= 4; x >>= 4
funktioniert nur, wenn Ihr 'Byte' ein ordnungsgemäß vorzeichenloser Typ ist. Wenn es sich tatsächlich um ein signiertes Zeichen handelte, könnte die zweite Operation die Zeichenerweiterung verursachen (d. H. Ihr ursprüngliches Bit 3 würde dann auch in den Bits 4-7 erscheinen).
Ohne Optimierung wird dies natürlich zwei Anweisungen benötigen, aber mit GCC unter OSX reduziert sogar
-O1
dies auf die erste Antwort.
x %= 16
selbst wenn der Optimierer aktiviert ist, wird dein Compiler mit ziemlicher Sicherheit hier das Richtige tun und die teure Div / Mod-Operation in die erste Antwort umwandeln. Allerdings kann es das nur für Zweierpotenzen tun, und dieses Paradigma macht es nicht so offensichtlich, was du erreichen willst.
Es gibt viele gute Antworten und einige von ihnen sind technisch die richtigen.
In einem größeren Maßstab sollte man verstehen, dass C / C ++ kein Assembler ist. Aufgabe des Programmierers ist es, dem Compiler die Absicht zu erklären, was Sie erreichen wollen. Abhängig von der Architektur und verschiedenen Optimierungsflags wird der Compiler den besten Weg wählen.
x & amp; = 0x0F; ist der klarste Weg, dem Compiler zu sagen, was Sie erreichen wollen. Wenn das Hoch- und Runterschalten bei manchen Architekturen schneller ist, ist es Aufgabe des Compilers, es zu wissen und das Richtige zu tun.
Es wird in gewissem Maße von der Architektur abhängen - das Hoch- und Runterschalten auf einem ARM ist wahrscheinlich der schnellste Weg - aber der Compiler sollte das für Sie tun. Tatsächlich werden alle vorgeschlagenen Methoden wahrscheinlich vom Compiler auf denselben Code optimiert.
Tags und Links optimization c++ operators shift modulo