005
24.07.2003, 13:26 Uhr
ao
(Operator)
|
Zitat: |
0xdeadbeef postete
C++: |
int a = 1<<7 + 1<<6 + 1<<5 + 1<<4 + 1<<2 + 1 <<1; /*0000 0000 1111 0110*/ ; int b = a << 8; /* a um 8 nach links verschoben: 1111 0110 0000 0000 */ int c = 1<<7 + 1<<5 + 1<<1 + 1; /*0000 0000 1010 0011*/ int d = b | c; /* bitweise geodert, 1111 0110 1010 011. In diesem Fall wäre auch */ int e = b + c; /* möglich, weil es keine Überschläge gibt.*/
|
|
Man kann es gar nicht laut genug schreien: Bit-Ausdrücke, d.h. Ausdrücke, die mit |, &, ~, << oder >> gebildet werden, und numerische Ausdrücke (mit +, -, *, /, %) dürfen nur mit allergrößter Vorsicht gemischt werden! Das sind verschiedene Welten, Übereinstimmungen sind rein zufällig. Wenn man das zur unbedachten Routine werden läßt, dann sind Programmierfehler die sichere Folge.
Die Ausdrücke b|c und b+c sind hier nur deshalb austauschbar, weil es keine Bits gibt, die in beiden Variablen 1 sind. Auch die Initialisierung oben (int a = ....;) ist eigentlich schon falsch, die + gehören durch | ersetzt.
Früher gabs auch mal den beliebten Optimierungstrick, bei Multiplikationen oder Divisionen mit Zweierpotenzen nicht zu rechnen, sondern den Schiebe-Operator anzuwenden.
Heutzutage beherrschen die Compiler so was besser als die Programmierer, so daß solche Tricks absolut nichts mehr bringen und nur noch den Algorithmus verschleiern, den nächsten Entwickler, der den Sourcecode lesen muß, hinters Licht führen und für unerwartete Seiteneffekte sorgen, falls die beteiligten Variablen mal von unsigned auf signed umdeklariert werden.
ao |