2016-07-22 8 views
-1

Ein Zweck des Linksverschiebungsoperators ist die Multiplikation des linken Operanden mit 2 und die rechte Verschiebung für die Ganzzahldivision. Beide haben auch Einschränkungen wie undefiniertes Verhalten Link usw. Ich verstehe nicht, was der wirkliche Gebrauch sein wird. Ich bin sogar nicht zuversichtlich, sie für Division oder Multiplikation zu verwenden.Was ist der wirklich starke Einsatz von Schichtoperatoren in C?

+0

[Was sind bitweise Verschiebung (Bit-Shift) Operatoren und wie funktionieren sie?] (Http://stackoverflow.com/q/141525/995714) [Wie stellen Sie, klar und ein Umschalten Einzelbit in C/C++?] (http://stackoverflow.com/q/47981/995714) –

+0

Die einzige wirkliche Verwendung von 'Shift-Operatoren' ist das Verschieben von Bits. Je nach Problem/Anforderung finden sie ihre Verwendung. Zu verstehen, was sie tun, kann helfen oder kann bei der Implementierung hilfreich sein. – sameerkn

+0

Vielleicht ist die wirkliche Frage, die Sie stellen möchten, __Was sind Schichtoperationen nützlich für__. – mcmlxxxvi

Antwort

1

Sie sind bitweise Operatoren und werden daher für bitweise Operationen verwendet. Hier ist ein triviales Beispiel, das einige bitweise Operationen zeigt, die nach Bitverschiebung verlangen.

struct color { 
    unsigned char r; 
    unsigned char g; 
    unsigned char b; 
}; 

void setColor(struct color*,int); 
int getColor(struct color*); 

int main() { 
    struct color myColor; 
    int color; 
    setColor(&myColor,0x00ff00); 
    color = getColor(&myColor); 
    return 0; 
} 

void setColor(struct color* color,int rgb) { 
    color->r = (rgb>>16)&0xff; 
    color->g = (rgb>>8)&0xff; 
    color->b = rgb&0xff; 
} 

int getColor(struct color* color) { 
    return color->r<<16|color->g<<8|color->b; 
} 
+0

Die rechte Verschiebung eines 'int' verursacht ein implementierungsdefiniertes Verhalten, wenn' rgb' negativ ist. Besser, wenn Code 'unsigned rgb' verwendet. – chux

+0

Wenn rgb negativ ist, spielt es keine Rolle, da die Bitmaske 0xff alle Bits außer der ersten 8 löscht. – kamoroso94

1

Ein wirklicher Anwendungsfall ist die Manipulation von Bitmasken. Wenn ich zum Beispiel eine Bitmaske x habe und ich das siebte Bit von rechts setzen möchte (wo ich anfange, bei Null zu zählen), könnte ich Folgendes tun.

x = x | (1 << 7); 
+0

Die Verwendung von 'unsigned' hat Vorteile, wenn' n' das Zeichenbit von '1' beeinflussen kann. Suggest '(1u << n)' – chux

4

Nur Anfänger würde jemals eine Verschiebung für die Division oder Multiplikation (einschließlich Menschen, die Software seit Jahrzehnten und sind noch Anfänger schreiben) verwenden.

Schaltvorgänge dienen zum Verschieben von Bits. Wenn Sie Bits verschieben möchten, verwenden Sie sie. Wenn Sie nicht wissen, was Verschiebungsbits bedeutet, möchten Sie sie nicht verwenden.

+5

"Nur Anfänger würden eine Schicht für die Multiplikation verwenden ** heute **". In der Vergangenheit waren Compiler bei weitem nicht so gut in der Optimierung, und es könnte einen sehr signifikanten Unterschied in der Leistung machen, diese Art von Mikrooptimierungen zu machen. –

+0

@MartinBonner wahr. Gibt es also heute einen Unterschied zwischen der Teilung durch 8 und der Verschiebung um 3 mal zum Beispiel? –

+0

"Wenn Sie nicht wissen, was Verschiebungsbits bedeutet, wollen Sie sie nicht verwenden". Sonst wäre es selten. Es sollte nicht als "Vergiss es, wenn du es nicht weißt" verstanden werden. – EFenix