运算规则

二进制:相同为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连接es笔记一之连接与查询es

    本文首发于公众号:Hunter后端 原文链接:Python连接es笔记一之连接与查询es 有几种方式在 Python 中配置与 es 的连接,最简单最有用的方法就是定义一个默认的连接,如果系统不是需要 ...

  2. 手牵手带你实现mini-vue

    1 前言 随着 Vue.React.Angularjs 等框架的诞生,数据驱动视图的理念也深入人心,就 Vue 来说,它拥有着双向数据绑定.虚拟dom.组件化.视图与数据相分离等等造福程序员的优点,那 ...

  3. Go语言中的原子操作

    1. 引言 在并发编程中,多个协程同时访问和修改共享数据时,如果没有使用适当的机制来防止并发问题,这个时候可能导致不确定的结果.数据不一致性.逻辑错误等严重后果. 而原子操作是解决并发编程中共享数据访 ...

  4. Fabric架构详解

    1 整体架构 2 运行架构 Fabric CA(可选) peer:主节点模块,负责存储区块链数据,运行维护链码 orderer:交易打包,排序模块 cryptogen:组织和证书等资料生成模块 con ...

  5. AcWing 4495. 数组操作题解

    思路 此题较为简单,简述一下思路. 从小到大排序,每次选取最小值,只要不为0即可 每次都为序列减去一个数字太慢,但每个数又减去的数字一样,所以可以用minus记录每个数要减去的数 C++代码 #inc ...

  6. 在VS Code 中调试远程服务器的PHP代码

    背景 对于PHP的调试,一般来说我们用 echo 和 var_dump 就够用了. 有时会碰到要解决复杂的逻辑或需要确认代码的运行顺序,这里用var_dump效率就比较低了,这时建议用断点的方式进行代 ...

  7. spring-boot-plus2.7.12版本重磅发布,三年磨一剑,兄弟们等久了,感谢你们的陪伴

    Everyone can develop projects independently, quickly and efficiently! spring-boot-plus是一套集成spring bo ...

  8. 基于ChatGPT上线《你说我猜》小游戏

    摘要 AIGC.GPT.休闲小游戏三者可以怎么结合? AIGC.GPT与小游戏的结合为游戏体验带来了新的可能性.AIGC(Artificial Intelligence Game Content)作为 ...

  9. MD文本编辑工具推荐-matktext

    最开始是用vscode编辑markdown文档,左边写右边看效果的实时渲染模式,对于markdown编辑来说是多余的,多是文字类的内容,配以插图,复杂表格和脑图则更少.之后接触到Typora,所打即所 ...

  10. mysql基础_约束

    介绍 约束对应的英语单词:constraint,在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性.有效性. 约束的作用就是为了保证:表中的数据有效. 类型 非空约束:not ...