006
17.05.2004, 23:04 Uhr
ao
(Operator)
|
Zitat: |
Pablo postete Wie du siehst, dann muss i mindestens an der 7. Stelle ein Bit gesetzt haben, damit i&~077 true zurückliefert. Also, i muss größer als 2^7 = 128 sein.
Äquivalent zu if(i&~077) ist dann if(i>127).
|
Beide Aussagen stimmen nicht, bitte noch mal nachrechnen.
077 ist dasselbe wie 00111111 (binär), also 63 (dezimal), nicht 127.
"if (i & ~077) ist äquivalent zu if (i > 63)" stimmt auch nicht, denn die erste Bedingung ist auch wahr für i < 0, wenn die Binärdarstellung für negative Zahlen das Zweierkomplement mit Vorzeichen im höchsten Bit verwendet.
Der letzte Punkt ist eine gefährliche Falle, weil man leicht vergisst, auch an die negativen Zahlen zu denken. Deswegen sollte man es sich zur Gewohnheit machen, Bedingungen möglichst "wörtlich" zu kodieren und nicht in irgendwas anderes zu übersetzen, von dem man glaubt, dass es äquivalent ist. Die Fehler, die aus so was entstehen, sind sehr ärgerlich, weil vermeidbar und damit überflüssig.
Ganz nebenbei ist der Code auch leichter zu lesen, wenn man sich drauf verlassen kann, dass der Programmierer das, was er da getippt hat, auch so gemeint hat und nicht rätseln muss, ob er nicht in Wahrheit was anderes wollte. |