首页 > 其他分享 >DAY005_异或运算

DAY005_异或运算

时间:2023-09-14 17:57:40浏览次数:31  
标签:运算 int xx eor 异或 数次 DAY005 数字

运算规则

二进制:相同为0 相异为1

十进制:相同为0 任何数字和0异或都是它本身

不利用额外变量交换两个数

数组中一种数字出现了奇数次,其他数都出现了偶数次,怎么得到这个出现了奇数次的数

将所有的数异或 得到的结果就是这个期望的数字

异或可以使用交换律,所有出现了偶数次的数字异或是0,出现了奇数次的数字异或得到这个数字本身

0和这个数字异或还是这个数字

public class Day006_1_找到出现了奇数次的数 {
    @Test
    public void test01(){
        int[] xx = {1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1};
        int eor = xx[0];
        for (int j = 1; j < xx.length; j++) {
            eor = eor ^ xx[j];
        }
        Assert.equals(eor, 9);
    }
}

数组中两种数字出现了奇数次,其他数都出现了偶数次,怎么得到这两个出现了奇数次的数

先决条件注意异或的运算规则。见上文

假设两种出现了奇数次的数字分别是 a 和 b,数组的所有元素异或得到的结果EOR = a ^ b ≠ 0
因此对于 EOR 任何一个是 1 的二进制位上,a 和 b 在这个二进制位上的数字 一个是1 另一个是0
因此如果 EOR 能只保留下一个是 1 的二进制位其余位都归零 得到一个数字 K,比如00001000
那么K & aorK & b肯定一个是1 另一个是0& 运算只有11得1 其余都得0

因此关键就是怎么得到这个数字K

很简单:一个数字的补码 & 其相反数的补码 就能够得到
比如:一个正数 & 其相反数的补码 = 正数补码是它本身 & (正数取反得到相反数的反码+1)
相关计算可以参考 001 中的举例如下

通过下面的代码可以得到 ab 中的其中一个

public class Day006_2_找到出现了奇数次的两个数 {
    @Test
    public void test01(){
        //两个数是8和9
        int[] xx = {1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,8};
        int eor = 0;
        for (int i : xx) {
            eor = eor ^ i;
        }
        Assert.equals(eor, 8 ^ 9);
        //eor只保留一个是1的二进制位
        //例如:00000001 00001000 01000000
        int onlyOne = eor & (-eor);
        //注意异或的运算规则,相同为0 相异为1
        int one = 0;
        for (int j = 1; j < xx.length; j++) {
            //如果不等于0 说明是两个数字其中的一个 或者是出现了偶数次的数字 循环完毕得到ab中的其中一个
            if ((xx[j] & onlyOne) != 0) {
                one = one ^ xx[j];
            }
        }
        int another = one ^ eor;
        Assert.isTrue((one == 8 && another == 9) || (one == 9 && another == 8));
    }
}

标签:运算,int,xx,eor,异或,数次,DAY005,数字
From: https://www.cnblogs.com/felix-1/p/17703053.html

相关文章

  • 位运算总结
    位运算总结......
  • 运算符初学习
    运算符(学习后慢慢补充)算数运算符:+,-,*,/,%(取余),--(?)赋值运算符:=关系运算符:>,<,>=,<=,==,!=,instanceof(?)用于判断是否相等,在if句型中会用到以下尚未了解逻辑运算符&&(与),||(或),!(非你即我)位运算符&,|,^,~,>>,<<,>>>条件运算符?:扩展赋值运算符+=,-=,*=,/=备注使用除号要......
  • Nginx中实现逻辑运算
    nginx的配置中不支持if条件的逻辑与&&逻辑或||运算,而且不支持if的嵌套语法,否则会报下面的错误:nginx:[emerg]invalidcondition。我们可以用变量的方式来间接实现。要实现的语句:if($arg_unitid=42012&&$uri~/thumb/){echo"www.ttlsa.com";}如果按照......
  • 关于异或运算的一道题
      和白球的数量无关,  黑球偶数个时,概率0%。   黑球奇数个时,概率100%。  设白球是0,黑球是1    0 0 ——> 0          1 1——> 0   0 1 ——> 1        ......
  • 20-布尔值-比较运算符-逻辑运算符-短路问题
            ......
  • 17-浮点数-自动转换-强制转换-增强赋值运算符
         ......
  • C++算法进阶系列之倍增算法解决求幂运算
    1.引言学习倍增算法,先了解什么是倍增以及倍增算法的优势。如果面前有一堆石子,要求计算出石子的总数量。这是一个简单的数数问题,可以:一颗石子一颗石子的数。两颗石子两颗石子的数。三颗石子三颗石子的数。或者更多颗石子更多颗石子的数……在石子很多的情况下,每一次选择更......
  • 位运算
    位运算概述直接对整数在内存种的二进制进行操作。 &:与|:或^: 异或~:取反<<:各二进位全部左移若干位,高位丢弃,低位补0>>:各二进位全部右移若干位,对无符号数,高位补0,有符号数,右移补1. >>>:无符号右移,把二进制数右......
  • Python取余符号是什么?其运算规则有哪些?
    在Python中,取余运算是一种算术运算,又叫做模运算,是一种非常常用的运算方式,可以应用于判断奇偶数、计算周期、循环计数器等各种场景。那么Python中取余符号是什么?其运算规则有哪些?以下是详细内容介绍。Python中取余符号是什么?Python中的取余运算使用百分号%作为符号,其......
  • 为什么使用图进行关联运算比表Join更具吸引力?
    GeaFlow(品牌名TuGraph-Analytics)已正式开源,欢迎大家关注!!!欢迎给我们Star哦!GitHub......