Forum: Object-Pascal / Delphi-Language
Delphi
by negaH,
24. Sep 2004
Tja, da schnappt die MOD-Falle zu. Mathematisch gibt es zwei glasklare Definitionen
MOD -> +-x mod +y == +x mod +y, d.h. das Resultat nimmt immer das Vorzeichen des Dividenten an.
REM -> +-x rem +y == +-x rem +<, d.h. das Resultat nimmt das Vorzeichen des Divisors an.
Leider verhält sich der Delphi MOD Operator eben nicht so wie es in der Mathematik definiert wurde.
Sprich:
-8 mod...
Forum: Object-Pascal / Delphi-Language
Delphi
by negaH,
9. Sep 2004
Warum ist das so ?
Weil es nur zwei Lösungen geben kann, eine TRUE und eine FALSE, wenn man fragt "ist Zahl nicht Null ?"
Jede IF THEN Abfrage die man so optimiert das der Compiler nur ZWEI Antworten liefern kann, bzw. abfragen muß, ist in Assembler am effizientesten zu codieren. Man sollte, wenn es möglich ist, also die IF THEN Bedingungen so umschreiben das daraus eine Boolsche Abfrage...
Forum: Object-Pascal / Delphi-Language
Delphi
by negaH,
9. Sep 2004
Wie übersetzt der Compiler
Zahl mod 2
??
Er übersetzt es direkt in
Zahl and 1
Forum: Object-Pascal / Delphi-Language
Delphi
by negaH,
9. Sep 2004
nein ist es nicht,
1.) sagte ich schon das ich niemals bei solchen Boolschen Auswertungen es so schreiben würde
if Flag and 1 = 1 then;
if Flag and $80 = $80 then ;
sondern immer
if Flag and 1 <> 0 then ;
if Flag and $80 <> 0 then ;
Forum: Object-Pascal / Delphi-Language
Delphi
by negaH,
9. Sep 2004
if Zahl and 1 <> 0 then ;
entspricht dem Odd, und ist auch das schnellste.
if Zahl and 1 = 1 then ;
beinhaltet in Assembler einen Vergleich eines Registers mit einer Zahl die im Speicher steht, somit wesentlich ineffizienter.
Nutze ODD() dafür ist es da, und auch optimiert.