Java中多个操作数的按位异或

pop*_*vic 2 java bit-manipulation xor bitwise-xor

我想对多个操作数进行按位操作,这样当只有一个整数在这个位置有1位时输出的整数为1,否则为0.

我正在使用:(a ^ b ^ c ^ d ^ e ^ f ^ g ^ h ^ i)^(a&b&c&d&e&f&g&h&i)

a: 0000001000
b: 0000000010
c: 1010000000
d: 0000110000
e: 0001000000
f: 0000110000
g: 1000100000
h: 0000000100
i: 0100000000
Run Code Online (Sandbox Code Playgroud)

我想得到:

   0111001110
Run Code Online (Sandbox Code Playgroud)

但是,我得到:

   0111101110
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?或者我应该修改什么?

har*_*old 5

实际上你可以通过按位运算计算.

int atLeastOne = 0 将是一个掩码,指示在1个或多个输入中设置的位.

int moreThanOne = 0 将是一个掩码,指示在2个或更多输入中设置的位.

输入x可以"添加"到该状态:

// if a bit has been set already and it is set again now, it has been set more than once
moreThanOne |= atLeastOne & x;
// if a bit is set now, it is set at least once
atLeastOne |= x;
Run Code Online (Sandbox Code Playgroud)

只需对所有内容(在开始时简化):

atLeastOne = a;
moreThanOne |= atLeastOne & b;
atLeastOne |= b;
moreThanOne |= atLeastOne & c;
atLeastOne |= c;
moreThanOne |= atLeastOne & d;
atLeastOne |= d;
moreThanOne |= atLeastOne & e;
atLeastOne |= e;
moreThanOne |= atLeastOne & f;
atLeastOne |= f;
moreThanOne |= atLeastOne & g;
atLeastOne |= g;
moreThanOne |= atLeastOne & h;
atLeastOne |= h;
moreThanOne |= atLeastOne & i;
atLeastOne |= i;
Run Code Online (Sandbox Code Playgroud)

有一点已经设置恰好一次,如果它已经被设置至少一次,并且不超过一次:

int exactlyOne = atLeastOne & ~moreThanOne;
Run Code Online (Sandbox Code Playgroud)