热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

开发笔记:不借助第三个变量交换a,b两个变量值

篇首语:本文由编程笔记#小编为大家整理,主要介绍了不借助第三个变量交换a,b两个变量值相关的知识,希望对你有一定的参考价值。从

篇首语:本文由编程笔记#小编为大家整理,主要介绍了不借助第三个变量交换a,b两个变量值相关的知识,希望对你有一定的参考价值。



从一个面试题说起...


不借助第三个变量交换a,b两个变量值


一个很经典的答案是通过异或来解决


a=a^b;
b=a^b;
a=a^b;

关键字


[
"异或",
"逻辑运算符",
"乔治·布尔",
"香农"
]

先决条件


0为假,1为真


插曲>>>如果读到"0为假,1为真",心底肯定略过了,这谁都知道的啊...
但是如果是写出来,但是找不到出处.即使常识也不太肯定了...

"^":对应逻辑运算异或(XOR)。

重点在"异",只有[1]XOR[0]或[0]XOR[1]才为1;一真一假即真;


a ^ a = 0 ;

a ^ 0 = a ;



先决条件.出处和推导


0为假,1为真


香农已经知道,数学上有一种逻辑代数系统,叫做布尔逻辑,它得名于英国数学家乔治·布尔(George Boole)。在布尔逻辑中,任何逻辑表达式的计算结果都不是数值,而是“真”、“假”这两种真值。你只需要使用逻辑运算符“与”、“或”、“非”,就可以表达任何你想表达的逻辑语句。



在逻辑中,真值或逻辑值是指示一个陈述在什么程度上是真的。在计算机编程上多称作布尔值。在经典逻辑中,唯一可能的真值是真和假。但在其他逻辑中其他真值也是可能的。


强行补充一波,如果你非要想让"1为假,0为真",请搜索:"负逻辑".

关于真假由来,我只能找这么多了...


a ^ a = 0 ;a ^ 0 = a ;

二进制的运算


0110
^ 0000
------------
= 0110

再来谈下两个变量的交换.

其实虽然变量值还是[a,b]

但是值可能会出现3个的.

举个栗子↓

|a的值|b的值|出现的值|

|:--:|:--:|:--:|

|0|0|[0]|

|0|1|[0,1]|

|9|5|[9,5,12]|

|...|...|...|

第一步a=a^b;此时,相当于将a和b绑定一下关系.

只有两个变量,没有第三者插足,要交换两个变量的值,不绑定关系,不可能凭空交换吧...


数据库角度考虑的话,类似,表A和表B本来是没有关系的,

但是又想交换两个表之间的数据,还不允许有第三张表的出现,

这个时候,更改了表A的结构.增加了一列.(插入这段话,希望不会让不懂的人更晕了...)



从关系角度来看:

1.建立关系a,此时的a已经变了...

2.根据关系,给b赋值为a,b←a,工作完成了50%

3.根据关系,给a赋值为b,a←b.


从更改状态来看:

1.a进化为a(状态1);b保持原状态;

2.b进化成最终状态b(状态1),即:a;

3.a再次进化成最终状态a(状态2),即:b;


从刚开始用3个变量,再用公式推导消除一个变量来看:

此时共有变量[a,b,c]

1.c=a^b;

2.b=a;

//其实到第3步运行之前,a的值是一直没有改变过的,

//所以c^a,可以推导出:(a^b)^a,这个时候要注意了,

//此时的b还是在c中的b,而不是第2步已经改变了值得b.(这不是引用类型...不是第2步b的值改了,c的值也跟着改)

//这个地方不太好理解,中心思想就是:先把a和b的关系放兜里,这个兜就是c,并且能通过一种运算,和未改变的a值,

//来反求出b的值;

3.a=c^a;

先将第2步"b=a;",修改一下

因为a^0 = a;可以写为:b=a^0;

因为b^b = 0;可以写为:b = a^b^b;

再加上括弧;

1.c0=a0^b0;

2.b1=(a0^b0)^b0;

3.a1=(a0^b0)^b1;

其实这个时候,将c替换成a,是完全可以的,

因为c除了第1步被赋值之后,就没有再改过值.

//a0和a1都是变量a,只是为了区分a值改变了一次,就会将a0写为a1

1.a1=a0^b0;

2.b1=a1^b0;

3.a1=a1^b1;

一共3个赋值动作,第1个赋值为了建立关系,剩下2个,就是赤裸裸的交换数据了.

感受一下,a和b,在这个过程中一共值发生了几次变化.

感觉最后两步讲的还是有点模糊,希望哪位大虾给完善下...

GG ... 晚安...


扩展



  • 逻辑运算["~","&","|","^"]


编辑时间列表

[1].二〇一六年十一月十五日 18:17:41

[2].贰零贰零年-一月十五号 晚


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
author-avatar
曹月洪_867
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有