从交换a,b的值开始--巧妙的C语言问题(持续更新)
2018-03-27 11:16
281 查看
一,不使用中间变量交换a,b的值
① "a=a+b"
用a将a,b的和存储起来,之后利用减法,b换成a,a再换成b
a=a+b; //a存变量之和b=a-b; //和-原b得到a
a=a-b; //和-原a得到b
②"a=a*b "
用a将a,b的积存储起来,之后利用乘法,b换成a,a再换成b
a=a*b; //a存变量之积b=a/b; //积除以原b得到a
a=a/b; //积除以原a得到b
②"a=a^b"
利用C语言位运算符异或--"^"
背景知识:异或,bit1和bit2不同则为1,相同则为0: 1^0=1;0^1=1;0^0=0;1^1=0;可以得到两个规律:1)bit和0异或还是bit: b^0=b
2)bit和自己异或得零: b^b=0
并且异或满足交换律和结合律,即异或式的值只与式中各因子的个数有关,与位置无关
又因为异或本身是位运算符,不产生进位则我们能进一步得到以下结论:
对于等长多位(字节)变量a,b,有: a^a=0; a^0=a;b^0=b;
进而有: a^b^a=a^a^b=0^b=b; a^b^b=a^0=a;
代码:a=a^b;
b=a^b;
a=a^b;
PS:对应异或的还有同或,当然,大多数语言并不提供同或运算符,因为 同或=!(^),
同或的规则和异或相反(按位),假设同或运算符为#,则故有:0#0=1;1#0=0;1#1=1;
推广至多位,则a#0=对a取反;a#a=全1;
或者由a^0=a;a^a=0;而同或#是异或^的非,故对a取反,对0(更准确地说应该是全0)取反,也可以得到相同结论。
声明:除已注明的引用外,文章系作者原创,引用转载请注明出处,如有必要请联系作者。
相关文章推荐
- C语言小问题解决方案(持续更新)
- c++(c语言)编程过程中遇到的细微问题总结(持续更新)
- 开始学习C语言C++在这里记录自己的成长。简单的两变量交换问题
- C语言中易错的问题(持续更新)
- 持续更新linux下遇到的问题。
- 学习计算机与软件遇到的问题及解决方法(持续更新)
- 【开发问题记录,持续更新..】
- Ubuntu -- Ubuntu系统问题处理大全(持续 更新)
- python自动化测试学习遇到的编程问题:*arg是啥,python自动化测试将测试结果写入excel中【持续更新】
- 问题汇总(持续更新)
- jxls 问题总结(自用--持续更新)
- android 开发中常见问题合集(持续更新)
- oracle 10g 常见问题收藏【持续更新】
- SQL语句常见问题的总结(持续更新)
- css高级应用及问题记录(持续更新)
- (持续更新)Xamarin.Forms之常见的问题
- C语言笔记系列文章 索引目录表(持续更新中......)
- .NET基础知识问题汇总(持续更新中)
- IntelliJ IDEA使用问题汇总(持续更新中)
- 常见问题(持续更新。。。)