U
bitschuppser schrieb:
Hier mit 14 Operationen:
int loe(unsigned x, unsigned y)
{
int hx = x >> 16, hy = y >> 16, h = !(hx ^ hy);
return (!h & ((hx + ~hy)>>31)) | (h & (x + ~ y)>>31);
}
Idee ist, den Trick von SG1 auf die höchsten 16 Bit und die tiefsten 16 Bit anzuwenden um den Over-/Underflow zu vermeiden.
Ich hab das mal durch unsere Testcases gejagt und entweder hab ich den Algorithmus falsch abgetippt oder aber er ist nicht ganz korrekt.
Das hier hab ich eingetippt:
int isLessOrEqual(int x, int y) {
unsigned int ux, uy;
int hx, hy, h;
ux = x;
uy = y;
hx = ux >> 16;
hy = uy >> 16;
h = !(hx ^hy);
return ((!h) & ((hx + ~hy)>>31)) | (h & ((x + ~y)>>31));
}
Ein paar Beispiele, wo das nicht zu funktionieren scheint:
(1[0x1],-2[0xfffffffe]) , (output 1, sollte 0)
([0x7ffffffb],[0x7ffffffb]), (output 0, sollte 1)
([0x6961b8a2],[0x80000004]), (output 1, sollte 0)
([0x80000004],[0x7fffffff]), (output 0, sollte 1)
Magst du vielleicht deine Idee etwas ausführlicher erläutern?