Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
Delphi 12 Athens
|
AW: Was macht: "foo := ord(s[t] >= s[t+1]);" ?
20. Mär 2024, 13:40
Bei dem Schnipsel geht es weniger darum was er macht. Es mehr darum das der Code kryptisch wirkt und Leser zum Grübeln bringt, wie dich jetzt
Und nein, das hat nicht wirklich was mit IF zu tuen.
In Delphi kommt da 0 oder 1 raus. Je nachdem was in s[t] und s[t+1] steht.
Ich denke mal es ging dem Programmierer dabei um Branchless-code um zeitintensive Fehler bei der Branchprediction im Prozessor zu vermeiden . Leider ist der Vergleich eigentlich ach wieder ein branching...
den müsste man noch weg rechnen.
Delphi-Quellcode:
Function GE(const x:integer; const y:integer):integer; Inline;
Begin
// geklaut hier https://codegolf.stackexchange.com/questions/226238/programming-less-than-greater-than-and-equal-to-functions-using-restricted-
Result := (x - y + 1) div (abs(x - y) + 1);
end;
foo := GE(s[t],s[t+1]);
Delphi-Quellcode:
// BRANCHLESS COMPARE FUNCTIONS
Function BL_GE(const x,y:Integer):Integer;Inline;
Begin
Result := (x - y + 1) div (abs(x - y) + 1);
End;
Function BL_LE(const x,y:Integer):Integer;Inline;
Begin
Result := BL_GE(y,x);
End;
Function BL_E(const x,y:Integer):Integer;Inline;
Begin
Result := BL_GE(x, y) * BL_LE(x, y);
End;
Function BL_L(const x,y:Integer):Integer;Inline;
Begin
Result := 1 - BL_GE(x, y); // ODER BL_LE(x, y) - BL_E(x, y)
End;
Function BL_G(const x,y:Integer):Integer;Inline;
Begin
Result := 1 - BL_LE(x, y); // ODER BL_GE(x, y) - BL_E(x, y)
End;
Andreas Monads? Wtf are Monads?
Geändert von QuickAndDirty (20. Mär 2024 um 14:23 Uhr)
|
|
Zitat
|