题目转化:现有A和B两个房间,其中居住的客人分别为a和b,现要求客人a和b互换房间,即A房间居住客人b,B房间居住客人a。
到这里已经可以看出,我们通过原始数据的异或结果a1,还原出了原始数据a,从而实现了将B(b1)空间内的数据更换为a。计算完成后,A空间内的数据a1
到这里已经可以看出,我们通过原始数据的异或结果a1,还原出了原始数据b,从而实现了将A空间内数据更换为b,a2等价于空间A,a2只是空间A的新名字,空间的地址未发生变化。计算完成后,A空间内的数据产生
加减法:这个稍微提下,(a b)-a就得到了原来的b,大致就是这样子,因为涉及到加减运算,其实还是加法运算,当数值非常大时,很容易造成栈溢出的问题,简单理解,你一直给我钱(进行加法运算),给我的钱太多,还没花完(计算结束)就发现这些钱在家里(空间)都堆不下了!!!留下了不争气的眼泪┭┮_┭┮
。这里如何得到原始数据a就很重要了,还记得之前我已经两次强调过的原始数据异或结果6的保存吗?此时这个结果就是a1的值(6),a1和b进行异或,结果放在b1中,原代码等价于:
C语言中,如本次代码示例中的inta和intb只是在内存中开辟出的两个*存储空间,他们的名字分别记作a和b,但其中存放的数据内容不一定是原来初始化时定义3和5,要结合后边的代码才能看到详细的数值变化和变化的过程。
本次介绍过程中,将空间A又取了两个新名字a1和a2,将空间B取了一个新名字b1,这里取新名字的原因主要是为了便于使用数学代换的方法理解连续异或的具体变化过程。后续只要看的多了,写的多了,也就能一眼看出来了。感谢每位读者的耐心*。
异或:计算过程不适合新手理解,有点绕,第一次看的时候可能没啥概念。优点就是完全不存在栈溢出的问题,因为在计算过程中只涉及到按位异或,即0和1的异或运算,除了优点外也没啥缺点。
根据异或的结合律和交换律,先让后边两个b进行异或,结果为零,零再与前边的a进行异或,结果还是a。
。这里还是要使用原始数据的异或结果a1,如果之前没有保存这个结果,就无法继续还原得到原始数据b。使用a1和b1进行异或,原代码等价于:
注意C语言中有符号位和无符号位的区别,在计算机中进行存储时,如本例中的int3和int5,都是正数,默认有符号位,最高位的0表示这个数字是正数,如果看到1,表示该数为负数。计算机中都是存储数据的二进制补码形式,负数写成补码形式进行运算分析后,记得恢复成原码查看数值。关于原码、反码和补码的知识请自行查找。
为了便于理解,粗略类比,接下来将空间a和b分别取个新名字A和B,初始化时给的数据分别记为a(=3)和b(=5),便于后续的分析和理解。空间可以理解为酒店的房间,数据可以理解为住房的客人,一旦酒店开始营业,房间位置不会发生变化,但居住的客人一直在流动。铁打的存储空间,流水的数据。
中间变量:使用中间变量很便捷,但最大的问题就是使用了中间变量,其它没啥问题,考官说了,不让用这个方法
从自反性可以看出,一个数和它本身进行异或,结果为零,如a^a=0;任何数和零进行异或,结果为这个任何数,如a^0=a。下边的分析中将会频繁使用。
标签: #使用 #c #xor #bool
免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如有疑问请发送邮件至:goldenhorseconnect@gmail.com