还得从一个很经典的面试题说起:不通过第三个变量来交换两个变量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两个值的新感的更多相关文章

  1. 关于Vue中,使用watch同时监听两个值的实现方法

    1. 先在computed中,用需要监听的两个值(start.end)定义一个对象(dateRange) computed: { dateRange () { const { start, end } ...

  2. 【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

    原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构 ...

  3. 《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

    对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才 ...

  4. 深入理解计算机系统(2.8)---浮点数的舍入,Java中的舍入例子以及浮点数运算(重要)

    前言 上一章我们简单介绍了IEEE浮点标准,本次我们主要讲解一下浮点运算舍入的问题,以及简单的介绍浮点数的运算. 之前我们已经提到过,有很多小数是二进制浮点数无法准确表示的,因此就难免会遇到舍入的问题 ...

  5. 深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字

    上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言 ...

  6. 运用《深入理解Java虚拟机》书中知识解决实际问题

    前言 以前看别人博客说看完<深入理解Java虚拟机>这本书并没有让自己的编程水平提高多少,不过却大大提高了自己的装逼水平.其实,我倒不这么认为,至少在我看完一遍这本书后,有一种醍醐灌顶的感 ...

  7. 《深入理解计算机系统V2》学习指导

    <深入理解计算机系统V2>学习指导 目录 图书简况 学习指导 第一章 计算机系统漫游 第二章 信息的表示和处理 第三章 程序的机器级表示 第四章 处理器体系结构 第五章 优化程序性能 第六 ...

  8. 深入理解计算机系统(4.1)---X86的孪生兄弟,Y86指令体系结构

    引言 各位猿友们好,计算机系统系列很久没更新了,实在是抱歉之极.新的一年,为了给计算机系统系列添加一些新的元素,LZ将其更改为书的原名<深入理解计算机系统>.这本书非常厚,而且难度较高,L ...

  9. 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断

    开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...

随机推荐

  1. struts2 CVE-2013-4316 S2-019 Dynamic method executions Vul

    catalog . Description . Effected Scope . Exploit Analysis . Principle Of Vulnerability . Patch Fix 1 ...

  2. Non Lasting Storage File System、procfs、sysfs

    catalog . 引言 . proc文件系统 . 简单的文件系统 . sysfs 0. 引言 传统上,文件系统用于在块设备上持久存储数据,但也可以使用文件系统来组织.提供.交换并不存储在块设备上的信 ...

  3. shutil模块

    shutil模块 提供了大量的文件的高级操作,特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作 常用方法 shutil.copyfile(src, dst) 复制文件内容(不包含元数据)从 ...

  4. HDU 5923 Prediction

    这题是2016 CCPC 东北四省赛的B题, 其实很简单. 现场想到的就是正解, 只是在合并两个并查集这个问题上没想清楚. 做法 并查集合并 + 归并 对每个节点 \(u\), 将 \(u\) 到根的 ...

  5. [JavaEE]理解ThreadLocal

    转http://www.iteye.com/topic/103804 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中 ...

  6. 【Beta】第一次任务发布

    后端 整理以下5个环节的API文档:登录注册.收藏以及获取收藏.个人信息的获取以及更新.发送实验数据以获取PDF报告 验收条件:每个接口说明请求格式(请求方式,请求内容)和返回格式 例: 请求 方式: ...

  7. 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 ...

  8. c#正则表达式2

    System.Text.RegularExpressions.Regex ___rx = new System.Text.RegularExpressions.Regex(@""& ...

  9. java 类的静态变量

    主要是记录一个奇葩的现象,java类中的静态变量,不仅可以通过类名称直接调用,而且还可以通过类的实力对象调用,java是不存在静态类的,如果非要用静态的类那就是内部类. 类中的静态变量是存储在JVM方 ...

  10. ansible定时任务

    不得不说,ansible很强大,ansible定制任务模块显示 ansible all -m cron -a 'name="ban IP of login" minute=* ho ...