Я думаю, что вы можете сделать это довольно просто, отслеживая, какие биты не являются уникальными.
static int xor(int[] arr) {
int all = 0;
int dup = 0;
for (int x : arr) {
// for each x in arr, record the bits which are
// in common with the bits we've already seen
dup |= x & all;
all |= x;
}
// remove bits which were not unique
return all & ~dup;
}
Думая о том, как это работает, вы можете сказать, что переменная all
хранит счетчик для каждогобит, но мы можем считать только до 1. Когда мы делаем x & all
, мы получаем 1 для каждого бита, который мы видели, по крайней мере, один раз плюс еще раз в x
, фактически позволяя нам считать до 2. dup
затем отслеживает каждый бит, который мы видим более одного раза.
В конце мы просто делаем all & ~dup
, который удаляет любой бит, который мы видели более одного раза.