Java中多个操作数上的按位异或
我想对多个操作数进行逐位运算,这样当只有一个整数在此位置有1位时,输出的整数有1位,否则为0位 我正在使用: (a^b^c^d^e^f^g^h^i)^(a&b&c&d&e&f&g&h&i) 与 我想得到:Java中多个操作数上的按位异或,java,bit-manipulation,xor,bitwise-xor,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) 与 我想得到: 0111001110 然而,我得到: 0111101110 知道为什么吗?或者我应该修改什么?实际上,您可以使用逐位运算来计算 int-atLeastOne=0将是一个掩码,指示在1个或多个输入中设置的位 int moreThanOne=0将是一个掩码,指示在2个或多个输入中设
0111001110
然而,我得到:
0111101110
知道为什么吗?或者我应该修改什么?实际上,您可以使用逐位运算来计算
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;
一切都要这样做(一开始就简化):
如果位已设置至少一次且不超过一次,则该位已精确设置一次:
int exactlyOne = atLeastOne & ~moreThanOne;
下面是另一种方法:
int a = 8;
int b = 2;
int c = 640;
int d = 48;
int e = 64;
int f = 48;
int g = 544;
int h = 4;
int i = 256;
int result = 0;
int [] arr = {a,b,c,d,e,f,g,h,i};
// go through all positions
for (int j = 0; j < 32; j++)
{
int ones = 0;
// go through each number for this position
for (int k = 0; k < arr.length; k++)
{
int val = arr[k] & (1 << j);
ones += (val > 0) ? 1 : 0;
}
result += (ones == 1) ? (1 << j) : 0;
}
System.out.println(result);
System.out.println(Integer.toBinaryString(result));
您需要一个循环来完成这项工作,因为每个比较的条件取决于以前比较的结果。
int exactlyOne = atLeastOne & ~moreThanOne;
int a = 8;
int b = 2;
int c = 640;
int d = 48;
int e = 64;
int f = 48;
int g = 544;
int h = 4;
int i = 256;
int result = 0;
int [] arr = {a,b,c,d,e,f,g,h,i};
// go through all positions
for (int j = 0; j < 32; j++)
{
int ones = 0;
// go through each number for this position
for (int k = 0; k < arr.length; k++)
{
int val = arr[k] & (1 << j);
ones += (val > 0) ? 1 : 0;
}
result += (ones == 1) ? (1 << j) : 0;
}
System.out.println(result);
System.out.println(Integer.toBinaryString(result));
462
111001110