【问题标题】:Java: Comparison between two arrays with binary operatorJava:使用二元运算符比较两个数组
【发布时间】:2014-08-27 12:59:22
【问题描述】:

我正在尝试编写一种方法,该方法将 2 个整数数组作为输入,并根据每个元素之间的二进制 & 比较它们,并考​​虑一个数组是否来自另一个数组。数组的大小也是已知且相等的。

因此,基本上如果该方法将 A = [2, 0, 0, 0] 和 B = [6, 0, 0, 3] 作为输入,它应该返回 true,因为 (2 & 6) != 0(小心这里的括号呵呵)但是如果它取相反的 A = [6, 0, 0, 3] 和 B = [2, 0, 0, 0] 它应该返回 false 因为 A 是从B(或 B 包含在 A 中)。

如果通过在位于相同位置的两个元素之间应用 & 运算符得到 true(基本上是该方法应该返回 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;
}

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

【问题讨论】:

  • 所以基本上如果方法将 A = [2, 0, 0, 0] 和 B = [6, 0, 0, 3] 作为输入,它应该返回 true,因为 (2 & 6) != 0(注意这里的括号,呵呵)。为什么要返回true?为什么要返回false
  • 你能在这种情况下定义包含和派生吗?
  • 它应该返回 true 因为 (A[0] & B[0]) == TRUE ,否则当你有 (B,A) 作为参数时它应该返回 FALSE 因为你可以从中派生 B A 因为 B 是 A 加上添加的东西,也就是 B 是从 A 派生的。
  • 就我而言,2 & 6 与 6 & 2 相同,因为 0010 & 0110 在二进制与运算方面是 0010。
  • 6 由 2 组成,因为 2 是 0010,而 6 是 0110。你在 2 中添加一些东西得到 6,因此 6 是从 2 派生的,而 [6,0,0,3] 是派生的来自 [2,0,0,0]。

标签: java arrays algorithm comparison


【解决方案1】:

我认为您正在寻找蕴涵A蕴涵B。这就是使您的示例给出您正在寻找的结果的按位运算。正如您和其他人所观察到的那样,您不能使用 &amp; 来执行此操作,因为它不会给出您想要的结果。

使用 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 进行测试,因为我们要测试所有结果值中的 所有位 都是 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多