Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中多个操作数上的按位异或_Java_Bit Manipulation_Xor_Bitwise Xor - Fatal编程技术网

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

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个或多个输入中设

我想对多个操作数进行逐位运算,这样当只有一个整数在此位置有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个或多个输入中设置的位

输入
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