运算规则

二进制:相同为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. Intellij IDEA最新激活码,适合2022,2023和所有版本,永久更新

    分享一下 IntelliJ IDEA 2023.1 最新激活注册码,破解教程如下,可免费永久激活,亲测有效,下面是详细文档哦~ 申明:本教程 IntelliJ IDEA 破解补丁.激活码均收集于网络, ...

  2. python mitmproxy抓包库

    一.简介 mitmproxy是一款用Python编写的支持HTTP(S)的中间人代理工具.它可以拦截.查看.修改.重放和保存HTTP/HTTPS流量 ,支持命令行界面和图形界面,可用于安全测试.网络调 ...

  3. 3. docker的实践玩法

    1. docker的进程架构 docker服务进程:就是针对docker服务的命令,启动,重启 接口:通过参数指定容器的IP和端口,实现对容器的远程操作 客户端命令行:对docker的操作命令 最后学 ...

  4. 行行AI人才直播第7期:奇计AI创始人左晟《AI时代的商业挑战和机遇》

    行行AI人才是博客园和顺顺智慧共同运营的AI行业人才全生命周期服务平台,是园子商业化努力的一个重要方向. 行行AI人才直播希望以直播的方式让大家更多了解AI行业的现状与未来可能的发展方向. 随着人工智 ...

  5. Seal AppManager如何基于Terraform简化基础设施管理

    作者简介 陈灿,数澈软件Seal 后端研发工程师,曾在腾讯负责敏捷研发体系建设以及 DevOps 解决方案的敏捷实践.在敏捷研发和产品效能提升有着丰富的经验,致力于构建一站式研发友好的平台工程解决方案 ...

  6. zabbix 可计算监控项使用 last() 与 avg() 的区别

    使用zabbix的可计算监控项时遇到的问题 在agent异常退出的情况下,使用last()的监控项依然在产出数据! 分析解决 last()函数会跳过空值,取最后一个有效值计算.遍查文档,只有用avg( ...

  7. Pandas: 获取dataframe中的值,并转换为列表

    解决方案 效果

  8. typroa文件迁移时的图片问题

    如下图所示设置即可 会自动在同级目录中创建img文件夹,并存储图片

  9. 自动刷新服务:nodemon

    安装命令: npm install -g nodemon 运行命令: nodemon server.js 运行结果:

  10. Qt+GDAL开发笔记(二):在windows系统msvc207x64编译GDAL库、搭建开发环境和基础Demo

    前言   上一篇使用mingw32版本的gdal,过程曲折,为更好的更方便搭建环境,在windows上msvc方式对于库比较友好.   大地坐标简介 概述   大地坐标(Geodetic coordi ...