Pracuję nad zadaniem domowym, w którym mamy wykonać funkcję o nazwie isGreater (x, y), która zwraca, jeśli x jest większe od y, ale możemy używać tylko operatorów bitowych razem z + i!. Rozwiązałem już problem, stosując regułę, jeśli x i y mają różne znaki, to x> = 0 i y < 0 lub jeśli x i y mają ten sam znak wtedy tylko wtedy, gdy y-x jest ujemne.Dlaczego ta większa niż funkcja działa?
Jednak gdy rozglądałem się, jak inni rozwiązali to, zauważyłem następującą metodę, która działa poprawnie z jakiegokolwiek powodu.
y = ~y;
return !(((x&y) + ((x^y) >> 1)) >> 31);
nie mogę dla życia mnie zrozumieć, dlaczego to działa, ja figura to ma coś wspólnego z pierwszego bitu w X, który nie mieści się w y albo coś?
Uwaga: Wygląda na to, że jest to poprawne rozwiązanie tylko wtedy, gdy x i y to ints, a nie unsigned int.
To jest dozwolone, wraz z! operator. Rozwiązanie jest całkowicie poprawne. – jamiees2
Przepraszam, popełniłem błąd, nie dołączając + i! operatorów. – jamiees2
Jeśli się nie mylę, jeśli x wynosi 1, a y jest 1, to zwraca 1. Czy funkcja ma być 'jestGreaterOrEqual (x, y)'? – indiv