Метод solution
возвращает null
, если нет решений. Если есть решение, оно возвращает a
(только для одного решения). Вы можете получить b
, выполнив s - a
или x^a
.
Если существует решение, общее количество решений (в long
) равно 2 до Long.bitCount(x)
.
Например, решение проблемы с s = 24
, x = 6
is a = 9
, b = 15
. в двоичном:
9 = 1001
15 = 1111
Эти цифры различаются в 2-х положениях, так что есть Math.pow(2, 2) = 4
решения в общей сложности. Вы можете получить все возможные решения, заменив биты a
соответствующими битами b
для некоторых или всех этих позиций.
Это дает еще 3 решения.
11 = 1011 13 = 1101 15 = 1111
13 = 1101 11 = 1011 9 = 1001
Вот код:
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;
}
Я решил писать метод возвращает HashSet
всех решения, так как эти наборы будут, в некоторых случаях могут быть массивными. Тем не менее, вы можете написать метод для создания всех возможных решений, не сохраняя их сразу в памяти. См., Например, Generating all binary numbers based on the pattern
Это операция питания или логическая побитовая «и»? – LutzL
@ LutzL Я думаю, что это XOR. – dasblinkenlight
его XOR жаль, что я должен быть более конкретным. – user2124726