我试图编写一个方法,将输入2个整数数组作为输入,并根据二进制和&在每个元素之间并考虑一个数组是否来自另一个。数组的大小也是已知且相等的。
所以基本上如果方法输入A = [2,0,0,0]和B = [6,0,0,3]它应该返回true,因为(2& 6)!= 0(小心)这里的括号为hehe)但如果它采用相反的A = [6,0,0,3]和B = [2,0,0,0]它应该返回false,因为A是派生的来自B(或B包含在A中)。
如果通过应用&位于同一位置的两个元素之间的运算符是正确的(基本上是方法应返回true的情况)。
到目前为止,我已经得到了以下代码,这些代码显然无法正常工作,因为如果一个数组是从另一个数组派生的,则不会考虑这些代码。我能想到的所有操作都是可交换的,并没有帮助。
private boolean checkContainment(int[] firstArr, int[] secondArr)
{
List<Integer> posList = new ArrayList<Integer>();
for(int i = 0;i < firstArr.length;i++)
{
if((firstArr[i] & secondArr[i]) != 0)
{
posList.add(i);
}
}
for(int j = 0;j < firstArr.length;j++)
{
if(posList.size() > 0)
{
for(int k : posList)
{
if((j != k) && (firstArr[j] != secondArr[j]))
{
return true;
}
}
}
}
return false;
}
我很确定调整以下代码以使其正确但我无法理解它是非常简单的。
答案 0 :(得分:1)
我认为您正在寻找暗示或 A暗示B 。这是按位操作,使您的示例提供您正在寻找的结果。正如您和其他人所观察到的那样,您无法使用&
来执行此操作,因为它无法提供您想要的结果。
使用Java按位运算符计算 A暗示B 的方法是~A | B
。
请参阅this question了解逻辑含义的真值表。它与C / C ++有关,但原理和按位运算符与Java中的基本相同。
鉴于长度相同的int a[]
和int b[]
,这是一种快速(Java 8)方法来测试数组中所有值的按位含义:
IntStream.range(0, a.length)
.map(i -> ~a[i] | b[i])
.allMatch(n -> n == ~0)
请注意allMatch
谓词针对~0
进行测试,因为我们要测试所有结果值的所有位是否为。