Jeśli nie ma rozwiązań, metoda zwraca . Jeśli istnieje rozwiązanie, zwraca a
(tylko dla jednego rozwiązania). Możesz uzyskać b
, wykonując s - a
lub x^a
.
Jeśli istnieje rozwiązanie, całkowita liczba rozwiązań (w long
) wynosi 2 do potęgi Long.bitCount(x)
.
Na przykład rozwiązanie znalezione dla s = 24
, x = 6
to a = 9
, b = 15
. binarnie:
9 = 1001
15 = 1111
Liczby te różnią się w 2 pozycji, więc istnieje Math.pow(2, 2) = 4
rozwiązania w całości. Możesz uzyskać wszystkie możliwe rozwiązania, wymieniając bity z a
z odpowiednimi bitami b
dla niektórych lub wszystkich tych pozycji.
Daje to 3 dalsze rozwiązania.
11 = 1011 13 = 1101 15 = 1111
13 = 1101 11 = 1011 9 = 1001
Oto kod:
public static Long solution(long s, long x) {
return recursive(s, x, false);
}
private static Long recursive(long s, long x, boolean carry) {
boolean s1 = (s & 1) == 1;
boolean x1 = (x & 1) == 1;
if ((s1 == x1) == carry)
return null;
if ((s == 0 || s == -1) && (x == 0 || x == -1))
return s;
Long a;
if (x1)
return (a = recursive(s >> 1, x >> 1, carry)) == null ? null : a << 1;
if ((a = recursive(s >> 1, x >> 1, false)) != null)
return a << 1;
if ((a = recursive(s >> 1, x >> 1, true)) != null)
return 1 + (a << 1);
return null;
}
postanowiłem przeciwko pisaniu metodę zwrócić HashSet
wszystkich rozwiązań, jak te zestawy będą w niektórych przypadkach być ogromny. Można jednak napisać metodę generowania wszystkich możliwych rozwiązań, bez jednoczesnego przechowywania ich wszystkich w pamięci. Zobacz na przykład: Generating all binary numbers based on the pattern
Czy to jest operacja zasilania, czy logiczna bitowa "i"? – LutzL
@LutzL Myślę, że to XOR. – dasblinkenlight
jego XOR przepraszam, że powinienem być bardziej szczegółowy. – user2124726