Was ist der schnellste Weg, um die 4 niedrigstwertigen Bits in einem Byte (C ++) zu erhalten?

7

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.

  1. x & lt; & lt; 4; x & gt; & gt; 4

  2. x% = 16

Irgendwelche anderen Möglichkeiten? Welcher ist schneller?

Danke.

    
Jon Seigel 17.11.2008, 10:39
quelle

6 Antworten

22

Ich verwende immer x &= 0x0f

    
Terje Mikal 17.11.2008, 10:43
quelle
37

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.

    
Alnitak 17.11.2008 11:21
quelle
10

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.

    
kauppi 17.11.2008 11:53
quelle
4

Einfache UND-Operation kann es tun.

%Vor%     
arul 17.11.2008 10:42
quelle
2

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.

    
MrZebra 17.11.2008 11:20
quelle
0

x = x & amp; 15

    
Glenner003 17.11.2008 10:44
quelle