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));
}
}
DAY005_异或运算的更多相关文章
- 网络误区:不用中间变量交换2个变量的value,最高效的是异或运算.
本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗? 这里简单的说一下我的环境:Win7 32位,Qt creator 5.4.1 编译器 ...
- C、C++、Java异或运算交换变量变量值的区别
今天看到一位大神的博客,深受感触.决定也发一篇博客,证明一下我还活着. 于是我翻看以前学习时做的一些笔记,整理了一下,得到了一个关于异或运算交换变量变量值的笔记. 首先来看下面三组表达式,看起来他们都 ...
- HDOJ 1287 破译密码(异或运算)
Problem Description 有个叫"猪头帮"的国家,采用一种简单的文法加密,他们所用的语言里面只有大写字母,没有其他任何字符:现在还知道他们加密的方法是:只用一个大写字 ...
- hdu2095 像水题的不错题 异或运算
异或运算的基础有点忘记了 先介绍一下..2个数异或 就是对于每一个二进制位进行位运算 具有2个特殊的性质 1.一个数异或本身恒等于0,如5^5恒等于0: 2.一个数异或0恒等于本身,如5^0恒等于5. ...
- bis和bic命令实现或和异或运算
从20世纪70年代末到80年代末,Digital Equipment的VAX计算机是一种非常流行的机型.它没有布尔运算AND和OR指令,只有bis(位设置)和bic(位清除)这两种指令.两种指令的输入 ...
- 二进制按位与(&) 按位或(|) 异或运算(^)
1.参加运算的两个数据,按照二进制进行按位与的运算. 运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; 即:两位同时为“1”,结果才为 ...
- 基于c#的windows基础设计(学习日记1)【关于异或运算】
第一次接触异或运算,总体来说比哈希算法简单的多,无论是理解还是代码的难易度,唯一不好的是在固定了密钥之后,随机性就小了很多,所以安全性比起哈希算法还是有所差距. 原理在网站上很多都有所以就不再赘述了. ...
- MATLAB:图像的与、或、非、异或逻辑运算(&、|、~、xor)
图像的与.或.非.异或逻辑运算涉及到了&.|.~和xor符号 close all;%关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clc; clear all; I=imrea ...
- BZOJ4103 异或运算
4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...
- 对java位运算之异或运算的一点记录
首先,异或运算是,每个位上的数不同为1,相同为0. 其次,对两个数值变量的值进行三次异或运算就等于是交换了两个变量的值. 例如: int a = 4; int b = 10; a = a ^ b; b ...
随机推荐
- Linux系统基础知识与自学方法
Linux系统基础知识与自学方法 大部分非计算机相关的朋友也经常使用电脑,所以我们频繁接触的是Windows系统.关于这个系统的评价不一,一部分人觉得简洁快捷,一部分人觉得问题(病毒.弹窗)多多,总之 ...
- celery笔记五之消息队列的介绍
本文首发于公众号:Hunter后端 原文链接:celery笔记五之消息队列的介绍 前面我们介绍过 task 的处理方式,将 task 发送到队列 queue,然后 worker 从 queue 中一个 ...
- 前端检测手机系统是iOS还是android(可实现根据手机系统跳转App下载链接)
快速实现前端检测手机系统是iOS还是android(可实现根据手机系统跳转App下载链接); 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plug ...
- 让AI支持游戏制作流程:从游戏设计到发布一个完整的生态系统
目录 引言 随着游戏产业的快速发展,人工智能(AI)技术在游戏开发中的应用越来越广泛.游戏设计人员可以通过利用AI技术来自动化游戏中的某些流程,提高游戏制作的效率,降低开发成本,同时还可以创造出更加具 ...
- https 原理分析进阶-模拟https通信过程
大家好,我是蓝胖子,之前出过一篇https的原理分析 ,完整的介绍了https概念以及通信过程,今天我们就来比较完整的模拟实现https通信的过程,通过这篇文章,你能了解到https核心的概念以及原理 ...
- MYSQL之批量删除(mybatis)
如果参数是array数组 <update id="deleteAll"> delete from C_V WHERE UUID in <foreach item= ...
- 从头学Java17-Stream API(二)结合Record、Optional
Stream API Stream API 是按照map/filter/reduce方法处理内存中数据的最佳工具. 本系列教程由Record讲起,然后结合Optional,讨论collector的设计 ...
- 代码发布平台jenkins中Check-out Strategy选项功能意义
第一个选项:Use'svn update' as much as possible 这个选项能实现快速发布:Use 'svn update' whenever possible, making th ...
- TCP/IP网络体系结构中,各层的作用,以及各层协议的作用。
1.[TCP/IP]协议中每层的作用 从协议分层模型方面来讲,TCP/IP由四个层次组成:数据链路层(网络接口层).网络层.传输层.应用层 TCP/IP网络体系结构中,各层作用: 1.网络接口层:负责 ...
- Web网页音视频通话之Webrtc相关操作(二)
效果图 HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...