我们可以使用位操作找到0是不是在数组中出现奇数次

Posted

技术标签:

【中文标题】我们可以使用位操作找到0是不是在数组中出现奇数次【英文标题】:Can we find if 0 occurs odd number of times in an array using bit manipulation我们可以使用位操作找到0是否在数组中出现奇数次 【发布时间】:2017-12-23 11:28:33 【问题描述】:

我知道,对包含其所有元素的整数数组的所有元素进行异或运算,除了出现偶数次的 1 个元素之外,会给出出现奇数次的数字。

示例

1, 1, 2, 2, 3 1 ^ 1 ^ 2 ^ 2 ^ 3 = 3;

^ 是异或

如果出现奇数次的数是0呢? 1, 1, 2, 2, 0

1 ^ 1 ^ 2 ^ 2 ^ 0 = 0    // Both give
1 ^ 1 ^ 2 ^ 2 = 0        // same answer  

如何确认0出现奇数次 PS : 更喜欢 C/C++ 中的答案代码

【问题讨论】:

也许您应该花一些时间来了解按位运算符的工作原理?不仅在您选择的语言中(选择一个!C 和 C++ 是两种截然不同的语言),而且在一般情况下。 看来您已经回答了自己的问题。您无法从“0 是唯一的单个数字”中区分“仅对”的 0。因此,您需要第二种方法来找出偶数/奇数个零。扭转局面:不,不仅仅是异或。 最后一个不是“一个包含所有元素的整数数组,除了 1 个元素出现偶数次”。所以毫不奇怪,这个技巧对它没有任何意义。 给定一个实际具有该属性的输入,它适用于 0。 @Someprogrammerdude 嘿,在位运算符中没有 C/C++。两者的语法相同。 【参考方案1】:

我们称 N,即数组中的元素数:

如果(N 为偶数)AND(对所有元素进行异或运算 ==0)-> 所有元素出现偶数次 如果(N 为奇数)AND(对所有元素进行异或运算 ==0)-> 您的单个元素为零。

这是check if an integer is even or odd in C / C++的方法

【讨论】:

以上是关于我们可以使用位操作找到0是不是在数组中出现奇数次的主要内容,如果未能解决你的问题,请参考以下文章

数组中有两种数出现了奇数次,其他数都出现了偶数次,分别找出出现奇数次的数

每日一题找到出现奇数次的数

每日一题找到出现奇数次的数

51nod 2106位运算(异或)一个奇数次

51nod 2106位运算(异或)一个奇数次

每日一题找到出现奇数次的两个数