深入理解计算机系统-从书中看到了异或交换ab两个值的新感
还得从一个很经典的面试题说起:不通过第三个变量来交换两个变量a,b的值...
一个很经典的答案是通过异或来解决:
第壹步:a=a^b;
第贰步:b=a^b;
第叁步:a=a^b;
以前提起“异或”运算,真的很疑惑?

今天看到“布尔代数简介”,再次看到这个异或运算,才知道异或运算符"^"和“&”和“|”一个级别...
好吧,大家一起来温习下"~"、"&"、"|"、"^"...【0为假,1为真】
"~":对应逻辑运算NOT,非。{比如:~0=1或者~1=0},'~真'即假,'~假'即真;
"&":对应逻辑运算AND,这个大家一定都熟悉。[0]AND[0或者1]都为0,所以只有[1]&[1]=[1];一假即假;
"|":对应逻辑运算OR。[1]OR[0或者1]都为1,所以只有[0]|[0]=[0];一真即真;
"^":对应逻辑运算异或(XOR)。重点在"异",只有[1]XOR[0]或[0]XOR[1]才为1;一真一假即真;
布尔运算[&|^]和整数运算符[+-*/]有很多相同的属性。
由于"一真一假即真",所以0^0=1^1=0,扩展到二进制1111^1111=0000,并且1111^0000=1111,
想想一年级的加法运算(每位相加):
+ ------- =
所以:
^ ------------ =
所以a^a = 0, a ^ 0 = a ;
这下再讲异或交换两个变量就好理解了吧···
并且答案一般都是直接给异或过程的,就如刚开始那样,要不就是一边过程计算一边讲解,这样最多就是讲了每一步的原因,没讲到为什么要这样的步骤...
倒着推或许更好理解点,只要小学学会乘法/加法交换律就行了...
第0步:最后的结果就是a = b ,b = a ;
第1步:a = b ^ 0 = b ^ (a ^ a) = a ^ a ^ b; b = a ^ 0 = a ^ ( b ^ b) = a ^ b ^ b; (0为什么要消除?因为不能出现第三个变量啊,只能a和b)
第2步:发现上步a和b的最终形态都有a^b,先将a ^ b赋值给a或者b,大家貌似都是赋值给a了,咱也这样吧,(只能这么办了,不能第三个变量啊...) ;
a = (a ^ b) ;先求a的吧,a =a ^a ^b = a ^ a =0,,,,貌似不能先求a啊,再先试试来求b吧,如果b还求不出来,那么将a^b赋值给a是行不通的,
b = a^b^b=(a^b)^b=a^b(好吧,不为0,在重第0步开始看,能推到这步就行了;)
第3步:a =a^a^b;上步将a^b赋值给a了,(现在上步的a的作用还是类似第三个变量),上步将b=a了,所以a=a^a^b = a^b^a=(a^b)^a=a^b
(刚开始想的第二步刚开始a=a^b,然后b=a,那么a=a^b也改变值了,,把b当做引用类型了,自己把自己绕晕了...)
感觉最后两步讲的还是有点模糊,希望哪位大虾给完善下...
GG ... 晚安...
编辑二〇一六年十一月十五日 18:17:41

深入理解计算机系统-从书中看到了异或交换ab两个值的新感的更多相关文章
- 关于Vue中,使用watch同时监听两个值的实现方法
1. 先在computed中,用需要监听的两个值(start.end)定义一个对象(dateRange) computed: { dateRange () { const { start, end } ...
- 【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误
原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构 ...
- 《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误
对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才 ...
- 深入理解计算机系统(2.8)---浮点数的舍入,Java中的舍入例子以及浮点数运算(重要)
前言 上一章我们简单介绍了IEEE浮点标准,本次我们主要讲解一下浮点运算舍入的问题,以及简单的介绍浮点数的运算. 之前我们已经提到过,有很多小数是二进制浮点数无法准确表示的,因此就难免会遇到舍入的问题 ...
- 深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字
上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言 ...
- 运用《深入理解Java虚拟机》书中知识解决实际问题
前言 以前看别人博客说看完<深入理解Java虚拟机>这本书并没有让自己的编程水平提高多少,不过却大大提高了自己的装逼水平.其实,我倒不这么认为,至少在我看完一遍这本书后,有一种醍醐灌顶的感 ...
- 《深入理解计算机系统V2》学习指导
<深入理解计算机系统V2>学习指导 目录 图书简况 学习指导 第一章 计算机系统漫游 第二章 信息的表示和处理 第三章 程序的机器级表示 第四章 处理器体系结构 第五章 优化程序性能 第六 ...
- 深入理解计算机系统(4.1)---X86的孪生兄弟,Y86指令体系结构
引言 各位猿友们好,计算机系统系列很久没更新了,实在是抱歉之极.新的一年,为了给计算机系统系列添加一些新的元素,LZ将其更改为书的原名<深入理解计算机系统>.这本书非常厚,而且难度较高,L ...
- 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断
开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...
随机推荐
- struts2 CVE-2013-4316 S2-019 Dynamic method executions Vul
catalog . Description . Effected Scope . Exploit Analysis . Principle Of Vulnerability . Patch Fix 1 ...
- Non Lasting Storage File System、procfs、sysfs
catalog . 引言 . proc文件系统 . 简单的文件系统 . sysfs 0. 引言 传统上,文件系统用于在块设备上持久存储数据,但也可以使用文件系统来组织.提供.交换并不存储在块设备上的信 ...
- shutil模块
shutil模块 提供了大量的文件的高级操作,特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作 常用方法 shutil.copyfile(src, dst) 复制文件内容(不包含元数据)从 ...
- HDU 5923 Prediction
这题是2016 CCPC 东北四省赛的B题, 其实很简单. 现场想到的就是正解, 只是在合并两个并查集这个问题上没想清楚. 做法 并查集合并 + 归并 对每个节点 \(u\), 将 \(u\) 到根的 ...
- [JavaEE]理解ThreadLocal
转http://www.iteye.com/topic/103804 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中 ...
- 【Beta】第一次任务发布
后端 整理以下5个环节的API文档:登录注册.收藏以及获取收藏.个人信息的获取以及更新.发送实验数据以获取PDF报告 验收条件:每个接口说明请求格式(请求方式,请求内容)和返回格式 例: 请求 方式: ...
- Linux下python升级至2.7
1. 下载python源码包 wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz2. 解压 tar -xjf Python-2.7 ...
- c#正则表达式2
System.Text.RegularExpressions.Regex ___rx = new System.Text.RegularExpressions.Regex(@""& ...
- java 类的静态变量
主要是记录一个奇葩的现象,java类中的静态变量,不仅可以通过类名称直接调用,而且还可以通过类的实力对象调用,java是不存在静态类的,如果非要用静态的类那就是内部类. 类中的静态变量是存储在JVM方 ...
- ansible定时任务
不得不说,ansible很强大,ansible定制任务模块显示 ansible all -m cron -a 'name="ban IP of login" minute=* ho ...