我是靠谱客的博主 美好石头,最近开发中收集的这篇文章主要介绍随笔06:异或的性质,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

        转载请注明出处:http://blog.csdn.net/ns_code/article/details/27568975

        这篇文章没有代码。介绍的是纯理论的思路。
        异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示。其运算法则是对运算符两側数的每个二进制位,同值取0,异值取1。它与布尔运算的差别在于,当运算符两側均为1时,布尔运算的结果为1,异或运算的结果为0。

== 异或的性质:==

  • 交换律:a^b = b^a;
  • 结合律:(ab)c = a(bc);
  • 对于随意的a:aa=0,a0=a。a^(-1)=~a。

        了解了上面这些。来看看这个,非常重要。后面的程序都要用到这个结论:

                   对于随意的a,有a^b^c^d^a^k = b^c^d^k^(a^a) = b^c^d^k^0 = b^c^d^k,也就是说。假设有多个数异或,当中有反复的数,则不管这些反复的数是否相邻。都能够依据异或的性质将其这些反复的数消去。

         详细来说,假设反复出现了偶数次。则异或后会所有消去。假设反复出现了奇数次,则异或后会保留一个。

以下来看两道题目:

  • 1、1-1000放在含有1001个元素的数组中,仅仅有唯一的一个元素值反复,其它均仅仅出现一次。每个数组元素仅仅能訪问一次,设计一个算法,将它找出来;不用辅助存储空间,是否能设计一个算法实现?

         当然。这道题,能够用最直观的方法来做。将所有的数加起来,减去1+2+3+…+1000的和,得到的即是反复的那个数,该方法非常easy理解,并且效率非常高。也不须要辅助空间。唯一的不足时,假设范围不是1000。而是更大的数字,可能会发生溢出。

         我们考虑用异或操作来解决该问题。

        如今问题是要求反复的那个数字,我们姑且假设该数字式n吧,假设我们能想办法把1-1000中除n以外的数字所有异或两次。而数字n仅仅异或一次。就能够把1-1000中出n以外的所有数字消去,这样就仅仅剩下n了。

        我们首先把所有的数字异或,记为T,能够得到例如以下:

T = 1^2^3^4...^n...^n...^1000 = 1^2^3...^1000(结果中不含n)

而后我们再让T与1-1000之间的所有数字(仅包括一个n)异或。便可得到该反复数字n。例如以下所看到的:

T^(a^2^3^4...^n...^1000) = T^(T^n) = 0^n = n

这道题到此为止。

  • 2、一个数组中仅仅有一个数字出现了一次,其它的所有出现了两次,求出这个数字。

明确了上面题目的推导过程,这个就非常easy了,将数组中所有的元素所有异或,最后出现两次的元素会所有被消去,而最后会得到该仅仅出现一次的数字。

该题目相同能够该为例如以下情景,思路是一样的:数组中仅仅有一个数字出现了奇数次,其它的都出现了偶数次。

最后

以上就是美好石头为你收集整理的随笔06:异或的性质的全部内容,希望文章能够帮你解决随笔06:异或的性质所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部