深入理解计算机系统-从书中看到了异或交换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觉得这些内容对程序猿 ...
随机推荐
- 文件属性之setuid位
setuid位是可执行文件的一个属性,ls -l /bin/ping 或mount等可以看到权限为-rwsr-xr-x 1 root root 含有s位,所属用户为root表明该文件可以被其他用户以该 ...
- 帝国备份王(Empirebak) \class\functions.php、\class\combakfun.php GETSHELL vul
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 EmpireBak是一款完全免费.专门为Mysql大数据的备份与导入而设 ...
- HFSS使用记录
一.基本设置 1.Tools \ Options,各种基本设置 1.1 Tools \ Options \ HFSS Options-> Duplicate boundaries/mesh op ...
- 加州大学伯克利分校Stat2.2x Probability 概率初步学习笔记: Section 4 The Central Limit Theorem
Stat2.2x Probability(概率)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...
- FZU 2193 So Hard (有限小数转换最简分数)(想法题)
题目链接: 传送门 So Hard Time Limit: 1000MS Memory Limit: 65536K 题目描述 请将有限小数化为最简分数. 输入 一个整数n 表示需要转化的小数个 ...
- PHP函数-检查某个值是否存在于数组中
函数:in_array -- 检查数组中是否存在某个值定义:bool in_array ( mixed needle, array haystack [, bool strict] )在haystac ...
- Mysql学习笔记(一)
技术的王国太过迷人,我刚从事IT就被各种技术所引诱迷惑,什么都想学.我还算言而有信的那一类人,还好有一丁点毅力,于是各种东西都沾染了一点.但是这种遍地开花的情况实在和我的智商不匹配.我没有那么多的精力 ...
- RAL 标准颜色表(RAL Color Chart)
根据经典RAL系统,本网页显示RAL标准颜色的概览.RAL用于信息,为图画和涂层定义标准颜色.现在,它是最流行的中欧颜色标准.这些颜色广泛用于建筑学,建筑物,工业和道路安全. 图表中的RAL颜色尽可能 ...
- JavaScript排序算法——选择排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- codeforces 711B - Chris and Magic Square(矩阵0位置填数)
题目链接:http://codeforces.com/problemset/problem/711/B 题目大意: 输入 n ,输入 n*n 的矩阵,有一个占位 0 , 求得将 0 位置换成其他的整数 ...