码迷,mamicode.com
首页 > 编程语言 > 详细

算法:异或运算^

时间:2020-06-13 12:43:18      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:oid   ble   array   inter   数字   author   view   binary   异或运算   

package club.interview.algorithm.eor;

import java.util.Arrays;

/**
 * 异或运算 == 无进位相加
 * 1. 找到整数二进制最后一个1的下标位置 {@link EorT#findIndexOne(int)}  }
 * 2. 统计整数二进制中1的个数 {@link EorT#countOne(int)}
 * 3. 找到数组中出现奇数次的1个数 {@link EorT#findNumOdd(int[])}
 * 4. 找到数组中出现奇数次的2个数 {@link EorT#findNumOdd2(int[])}
 * <p>
 * 知识点扫盲
 * 1. 异或运算特点
 * *  1.1 N = N ^ 0
 * *  1.2 0 = N ^ N
 * *  1.3 满足交换律和结合律
 * 2. 打印整数的二进制 {@link Integer#toBinaryString(int)}
 * 3. 对数求解 {@link Math#log(double)}
 *
 * @author QuCheng on 2020/6/13.
 */
public class EorT {

    /**
     * 1.找到整数二进制最后一个1的下标位置
     */
    private int findIndexOne(int num) {
        if (num == 0) return -1;
        return log2(num & (~num + 1));
    }

    /**
     * 2. 统计整数二进制中1的个数
     */
    private int countOne(int num) {
        int count = 0;
        while (num != 0) {
            count++;
            int rightOne = num & (~num + 1);
            num ^= rightOne;
        }
        return count;
    }

    /**
     * 3. 找到数组中出现奇数次的1个数
     * ** 数组中有且只有一个数出现过奇数次,找到该数字
     */
    private int findNumOdd(int[] num) {
        int eor = 0;
        for (int i : num) eor ^= i;
        return eor;
    }

    /**
     * 4. 找到数组中出现奇数次的2个数
     * ** 数组中有且只有2个数出现过奇数次,找到该数字
     */
    private int[] findNumOdd2(int[] num) {
        int eor = 0;
        // eor为a^b
        for (int i : num) eor ^= i;

        // eor1 为 a
        int rightAeorB = eor & (~eor + 1);
        int eor1 = 0;
        // 根据rightAeorB二进制中的1将A和B区分开
        for (int i : num)
            if ((i & rightAeorB) == rightAeorB)
                eor1 ^= i;

        // eor 为 b
        eor ^= eor1;
        return new int[]{eor, eor1};
    }


    public static void main(String[] args) {
        EorT e = new EorT();
        System.out.println("二进制打印 : " + Integer.toBinaryString(-2));
        int[] findIndexOne = {-1, 0, 5, 8};
        for (int i : findIndexOne) System.out.println("二进制中最后一个1的位置 " + i + " : " + e.findIndexOne(i));
        System.out.println("------------------");

        for (int i : findIndexOne) System.out.println("二进制中1出现次数 " + i + " : " + e.countOne(i));
        System.out.println("------------------");

        int[] findNumOdd = {12, 12, 5, 3, 6, 12, 3, 5, 6};
        System.out.println("出现奇数次的1个数 " + Arrays.toString(findNumOdd) + " : " + e.findNumOdd(findNumOdd));

        System.out.println("------------------");
        int[] ints = {12, 12, 5, 3, 6, 12, 3, 5, 6, 3};
        System.out.println("出现奇数次的2个数 " + Arrays.toString(ints) + " : " + Arrays.toString(e.findNumOdd2(ints)));
    }


    /**
     * 工具方法:对数求解
     */
    private int log2(int num) {
        return (int) (Math.log(num) / Math.log(2.0));
    }
}

  

算法:异或运算^

标签:oid   ble   array   inter   数字   author   view   binary   异或运算   

原文地址:https://www.cnblogs.com/nightOfStreet/p/13113415.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!