我正在考虑Java中的一个整数数组。数组大小由用户在程序开始时确定
我的想法是-给定相应二进制值的任何位置-结果应该显示1表示任何位,其中只有一个操作数具有1,而0表示任何其他组合。下面的例子可以更好地解释这个过程
像{4,5,6}这样的数组应该返回3,因为:
100
101
110
---
= 011
或者数字{12,4,9}
12 = 1100
4 = 0100
9 = 1001
---------
Val- 0001
我想这样做,但我意识到-因为我使用XOR -我的第一个例子的代码将返回7:
static void cpuTurn(int[] nimArray){
int[] val = new int[nimArray.length];
int holding = 0;
for (int i = 0; i < nimArray.length; i++) {
holding = holding^nimArray[i];
}
}
如何正确实现此操作?
发布于 2018-06-11 07:51:07
这样理解:
holding = 0
at 4:
holding = holding ^ 4; // 0 ^ 4 = 4 i.e. holding = 4, binary => 0 ^ 100 = 100
at 5:
holding = holding ^ 5; // 4 ^ 5 = 1 i.e. holding = 1, binary => 100 ^ 101 = 1
at 6:
holding = holding ^ 6; // 1 ^ 6 = 7 i.e. holding = 7, binary => 1 ^ 110 = 111
因此,持有的最终值是7。
如果要将两个以上的1外观设置为0
public static int[] split(int num){
int[] splits = new int[31];
for(int i=0; i < 31; ++i){
splits[i] = (num>>i & 1);
}
return splits;
}
static void cpuTurn(int[] nimArray){
int[] val = new int[nimArray.length];
int holding = 0;
int [] holdings = split(holding);
for (int i = 0; i < nimArray.length; i++) {
int [] splits = split(nimArray[i]);
for(int j = 0; j < splits.length; ++j)
holdings[j]+=splits[j]
}
int [] newVal = new int[31];
int k =0;
for(k = 0; k < 31; ++k)
if(holdings[k]>1 || holdings[k]==0)
newVal[k] = 0;
else
newVal[k] = 1;
int finalValue = 0;
for(k = 0; k < 31; ++k)
finalValue |= newVal[k]<<k;
System.out.println(finalValue);
}
https://stackoverflow.com/questions/50788976
复制相似问题