实现按位XNOR

时间:2014-11-27 10:06:57

标签: java c algorithm

我看到了一个问题,即从集合中找到只包含一个distict号码的非重复数字,其余的numberes可以重复任意偶数次。有一个约束,你需要使用常量内存在一次传递中找到该数字。 {假设所有都是正数} 通过实现这个功能,我很容易实现这一点

  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;

但这不起作用 Problem2
如果我采用像{2,5,7,5,7,1,2,7,5,2}这样的集合中的元素,那么XNORing会使数字的每三次出现为0,并且XNORing为1(单次出现)为0如果我翻转(〜)我从XNOR操作得到的东西,那么最后的结果就可以实现。但这也不起作用。

我知道为什么这个语义出错了,因为它是按位运算不合逻辑。但是如果xoring可以用于查找数字的奇数出现是不是有任何方法用XNOR来查找偶数的数字?
<登记/> 我不确定这个问题的可行性我只是出于好奇而请求,如果它在任何情况下无关紧要,请原谅我的无知。

1 个答案:

答案 0 :(得分:3)

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

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

a XNOR a也是 <{1}}的函数。它只是1位的整个负载。因此,您无法使用a恢复a的值,因此您的方法无效。