Java:两个带二元运算符的数组之间的比较

时间:2014-08-27 12:59:22

标签: java arrays algorithm comparison

我试图编写一个方法,将输入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;
}

我很确定调整以下代码以使其正确但我无法理解它是非常简单的。

1 个答案:

答案 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进行测试,因为我们要测试所有结果值的所有位是否为。