位运算的一些应用

  异或,位运算的一种:相同为0,不同为1。两个整数做异或,其实相当于这两个数无进位相加。
  异或满足的一些性质:0^a=aa^a=0a^b=b^aa^(b^c)=(a^b)^c
  面试题:

问题描述:
给定一个整形数组,
(1)假设其中只有1种数出现了奇数次,找出它;
(2)假设有两种数出现了奇数次,找出它;

  直接看代码:

/**
 * 问题描述:
 * 给定一个数组,当中有两种数出现的次数为奇数次,找出它们
 * **/
public class cp2 {

    public static void main(String[] args) {
        int[] arr = {10, 20, 3, 3};
        find2OddNum(arr);
        int[] arr1 = {1, 2, 2};
        find1OddNum(arr1);
    }

    public static void find2OddNum(int[] arr) {
        int eor = 0;
        for(int it : arr) {
            eor ^= it;
        }
        /**
         * 定义一个变量eor,赋初值为0,去与数组中每一个数做异或
         * 假设这两种数为a、b,显然有a!=b
         * 则eor=a^b
         * 则eor!=0,则eor必然至少有1位为1
         * 找出eor最右的1
         * **/
        int rightOne = eor & (~eor + 1);
        int a = 0;
        for(int it : arr) {
            if ((it & rightOne) == rightOne) {
                a ^= it;
            }
        }
        System.out.println(a + " " + (eor ^ a));
    }

    public static void find1OddNum(int[] arr) {
        int eor = 0;
        for (int it : arr) {
            eor ^= it;
        }
        System.out.println(eor);
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 异或的理解 我们通常把异或定义为不同为1,相同为0,即如如下真值表所显示: 但从另外一方面想,我们可以将异或...
    namedsatan阅读 512评论 0 2
  • 内容来自微信公众号 [算法与数据结构],整理起来,方便查看 判断一个正整数是不是2的乘方 原理图 代码实现 求出一...
    _祥_1990阅读 1,392评论 0 0
  • 了解面试算法之 - 栈&队列&位运算 本文已经授权 玉刚写作平台 提供写作赞助版权声明:本文版权归微信公众号 玉刚...
    醒着的码者阅读 859评论 0 0
  • 判断一个数是不是2的整数次幂 对于2的整数次幂,2进制的形式的一个特点是只有一个1。我第一次遇到这个问题是在一个公...
    漫游之光阅读 329评论 0 0
  • 认识异或运算 异或运算:相同为0,不同为1同或运算:相同为1,不同为0所以异或运算就可以记为无进位相加 异或运算的...
    鹰艺阅读 927评论 0 1