Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#5

AW: Was macht: "foo := ord(s[t] >= s[t+1]);" ?

  Alt 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)
  Mit Zitat antworten Zitat