运算规则

二进制:相同为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));
}
}

DAY005_异或运算的更多相关文章

  1. 网络误区:不用中间变量交换2个变量的value,最高效的是异或运算.

    本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗? 这里简单的说一下我的环境:Win7 32位,Qt creator 5.4.1 编译器 ...

  2. C、C++、Java异或运算交换变量变量值的区别

    今天看到一位大神的博客,深受感触.决定也发一篇博客,证明一下我还活着. 于是我翻看以前学习时做的一些笔记,整理了一下,得到了一个关于异或运算交换变量变量值的笔记. 首先来看下面三组表达式,看起来他们都 ...

  3. HDOJ 1287 破译密码(异或运算)

    Problem Description 有个叫"猪头帮"的国家,采用一种简单的文法加密,他们所用的语言里面只有大写字母,没有其他任何字符:现在还知道他们加密的方法是:只用一个大写字 ...

  4. hdu2095 像水题的不错题 异或运算

    异或运算的基础有点忘记了 先介绍一下..2个数异或 就是对于每一个二进制位进行位运算 具有2个特殊的性质 1.一个数异或本身恒等于0,如5^5恒等于0: 2.一个数异或0恒等于本身,如5^0恒等于5. ...

  5. bis和bic命令实现或和异或运算

    从20世纪70年代末到80年代末,Digital Equipment的VAX计算机是一种非常流行的机型.它没有布尔运算AND和OR指令,只有bis(位设置)和bic(位清除)这两种指令.两种指令的输入 ...

  6. 二进制按位与(&) 按位或(|)  异或运算(^)

    1.参加运算的两个数据,按照二进制进行按位与的运算. 运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1; 即:两位同时为“1”,结果才为 ...

  7. 基于c#的windows基础设计(学习日记1)【关于异或运算】

    第一次接触异或运算,总体来说比哈希算法简单的多,无论是理解还是代码的难易度,唯一不好的是在固定了密钥之后,随机性就小了很多,所以安全性比起哈希算法还是有所差距. 原理在网站上很多都有所以就不再赘述了. ...

  8. MATLAB:图像的与、或、非、异或逻辑运算(&、|、~、xor)

    图像的与.或.非.异或逻辑运算涉及到了&.|.~和xor符号 close all;%关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clc; clear all; I=imrea ...

  9. BZOJ4103 异或运算

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...

  10. 对java位运算之异或运算的一点记录

    首先,异或运算是,每个位上的数不同为1,相同为0. 其次,对两个数值变量的值进行三次异或运算就等于是交换了两个变量的值. 例如: int a = 4; int b = 10; a = a ^ b; b ...

随机推荐

  1. Python网页开发神器fac 0.2.9、fuc 0.1.29新版本更新内容介绍

    fac项目地址:https://github.com/CNFeffery/feffery-antd-components fuc项目地址:https://github.com/CNFeffery/fe ...

  2. JAVA 使用IText7 + Freemarker 动态数据生成PDF实现案例

    技术方案:IText7 + Freemarker 技术文档 Itext 官网:https://itextpdf.com/ itext API文档:https://api.itextpdf.com/iT ...

  3. Python自动化测试面试题精选(一)

    Python自动化测试面试题精选 今天由勇哥给你介绍一些Python自动化测试中常见的面试题,涵盖了Python基础.测试框架.测试工具.测试方法等方面的内容,希望能够帮助你提升自己的水平和信心. 项 ...

  4. Access+Trunk 配置

    实验拓扑 实验需求 按图示给各 PC 配置 IP 地址 在SW1和SW2上创建聚合组 PC1 与 PC3 属于 VLAN 10 : PC2 与 PC4 属于 VLAN 20 利用 Access 与 T ...

  5. Pytorch-如何在模型中引入可学习参数

    错误实例: def init(self): self.w1 = torch.nn.Parameter(torch.FloatTensor(1),requires_grad=True).cuda() s ...

  6. 助力长城汽车数据管道平台连接“数据孤岛”,加强数据一元化,Apache DolphinScheduler 的角色定位

    讲师简介 长城汽车-IDC-数据中台部-刘永飞 高级工程师 我是长城汽车 IDC-数据中台部的刘永飞,给大家分享一下我们自研的一个数据同步工具平台,以及在使用这个工具过程中遇到的问题.今天的分享主要有 ...

  7. 【HarmonyOS】一文教你如何在低代码项目中跳转H5页面

    ​ [关键字] 元服务.低代码.H5页面跳转.WebView [1.写在前面] 今天我们来实现一个在低代码项目中通过按钮跳转到H5页面的功能,本项目是基于API6的JS工程,我们的实现思路是在页面B中 ...

  8. expected unqualified-id on oneapi tbb12

    230628-expected unqualified-id eton@230628 在编译supra基于debian12 Qt5.15 tbb12 libtbb12/stable,now 2021. ...

  9. IoTOS v1.0.0 开源 高效 实用 | 免费商用

    IoTOS v1.0.0 一款高效实用 IoTCard 管理 & 运营系统. IoTOS 目前取名范围过大,其主要用于IoTCard 管理业务以高效.健壮.灵活设计 SaaS.多语言.机器人推 ...

  10. Windows同时安装多个JDK

    一.下载并安装JDK这一步选择你需要的JDK并下载安装,记得要记住安装的路径. 二.为JDK配置环境变量①找到系统环境变量 ②新建如下三个环境变量 第一个表示默认Java的home路径,以后在更改JD ...