【问题标题】:Implementing bitwise XNOR实现按位 XNOR
【发布时间】:2015-01-25 21:17:42
【问题描述】:

我看到一个问题,用于从仅包含一个不同数字的集合中查找非重复数字,其余数字可以重复任意偶数次。存在一个限制,即您需要使用常量内存在单遍中找到该数字。 {假设都是正数}。
我通过制作此功能轻松实现了这一点

  private static int nonRepeatingElement(int[] set) 
  {
        int element = 0;
        for (int i = 0; i < set.length; i++) 
        {
            element = (element ^ set[i]);
            System.out.println(element);
        }
    return element;
 }

这一切正常。
现在只是出于好奇,我想用类似的约束来改变问题。
问题1
我想到了一个集合,它现在包含可以出现任何奇数次的元素,除了一个元素甚至没有出现。 for example {2,5,7,5,7,1,2,7,1,5,2}
现在考虑到 XNOR 为每个奇数出现的 1 给出 0 的逻辑,我改变了代码有点像

 for (int i = 0; i < set.length; i++) 
            {
                element = (element ^ set[i]);
                System.out.println(element);
            }
        return ~element;

但这不起作用。
问题2
如果我采用 {2,5,7,5,7,1,2,7,5,2} 之类的集合中的元素,认为 XNORing 将使每三次出现的数字为 0,而 XNORing 与 1(单次出现)为 0将翻转 1 的位。因此,如果我翻转(~)我从 XNOR 操作中得到的位,则可以实现最终结果。但这也不起作用。

我知道为什么这种语义会出错,因为它是按位运算不合逻辑的。但是如果 xoring 可用于查找数字的奇数出现,XNOR 没有任何方法可以找到数字的偶数吗?

我不确定这个问题的可行性,我只是出于好奇而问,如果在任何情况下都无关紧要,请原谅我的无知。

【问题讨论】:

  • XNOR 应该是 ~(element ^ set[i]); 但现在 ~ 在循环之后。
  • 这里实际上有多个操作数(i/p),我必须对其应用 XNOR 操作。我无法级联 2 i/p xnor 操作的 o/p 以查找 3 i/p XNOR 操作。这就是为什么我首先对所有 i/p 进行异或运算,然后使用 ~,将最终异或值传递给调用函数。
  • 我认为你不能用恒定的内存来存储任何大小的数字。对于偶数重复,您是在“做某事”然后“撤消它”,但是对于奇数重复,这没有任何意义。您需要保留有关您之前找到的数字的更多信息。

标签: java c algorithm


【解决方案1】:

XORXNOR 是可交换的。这意味着序列的任何重新排序将始终产生相同的结果。

您已经知道a ^ a 为零。这就是单个数字抽象的工作原理:a ^ b ^ a 等于 a ^ a ^ b 等于 0 ^ bb

a XNOR a不是a 的函数。它只是一个 1 位的完整负载。因此,您无法使用 a XNOR a 恢复 a 的值,因此您的方法将不起作用。

【讨论】:

  • 那么在这种情况下还有其他方法可以实现结果吗?
  • 不使用布尔运算和 O(N) 遍历,不。为什么不尝试并证明呢?
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 2021-06-02
  • 2020-04-09
  • 2021-09-13
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多