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?
Antwort
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;
}
Die rechte Verschiebung eines 'int' verursacht ein implementierungsdefiniertes Verhalten, wenn' rgb' negativ ist. Besser, wenn Code 'unsigned rgb' verwendet. – chux
Wenn rgb negativ ist, spielt es keine Rolle, da die Bitmaske 0xff alle Bits außer der ersten 8 löscht. – kamoroso94
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);
Die Verwendung von 'unsigned' hat Vorteile, wenn' n' das Zeichenbit von '1' beeinflussen kann. Suggest '(1u << n)' – chux
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.
"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. –
@MartinBonner wahr. Gibt es also heute einen Unterschied zwischen der Teilung durch 8 und der Verschiebung um 3 mal zum Beispiel? –
"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
- 1. Was ist der Einsatz von Indexern?
- 2. Schichtoperatoren in PL/SQL
- 3. Was ist wirklich Atom?
- 4. Was ist der Einsatz von .blade im Laravel-Framework?
- 5. Was ist der Einsatz von If-Unmodified-Since HTTP Header?
- 6. Was ist Attachable wirklich hier?
- 7. Was ist wirklich ein Prinzipal in .NET?
- 8. Wie funktionieren Schichtoperatoren in Java?
- 9. C++ Ist privat wirklich privat?
- 10. Was ist der Zweck von :: in C#?
- 11. Was ist der Einsatz von Edi - Engran? Was heißt Mapping in Sander?
- 12. Was macht ein C-Cast wirklich?
- 13. Was ist die beste Vorgehensweise beim Einsatz von MODX?
- 14. Zeigerarithmetik und Arrays: Was ist wirklich legal?
- 15. Der richtige Einsatz von final
- 16. Starke Eigenschaft in ARC - Objective C
- 17. Ist __del__ wirklich ein Destruktor?
- 18. AWS - Was ist eine kanonische Anfrage wirklich?
- 19. Kategorie Einsatz in Objective-C
- 20. Was bedeutet Schrägstrich "\" wirklich?
- 21. Go - Was ist wirklich ein multipart.File?
- 22. Der richtige Einsatz von UIApplicationMain
- 23. Was ist der Vorteil von .c-Dateien?
- 24. Was sind starke Zeiger und schwache Zeiger
- 25. Was ist Rubys StringIO-Klasse wirklich?
- 26. Kann starke Namensgebung Probleme mit der Objektserialisierung in C# verursachen?
- 27. Der richtige Einsatz von Task.WhenAll
- 28. Wirklich niedrige Klangerzeugung in C#?
- 29. Was ist wirklich in Sitzung in ASP.NET gespeichert?
- 30. Was macht der getcontext-Systemaufruf (ucontext.h) wirklich?
[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) –
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
Vielleicht ist die wirkliche Frage, die Sie stellen möchten, __Was sind Schichtoperationen nützlich für__. – mcmlxxxvi