您的位置:首页 > 编程语言 > C语言/C++

从交换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)取反,也可以得到相同结论。

声明:除已注明的引用外,文章系作者原创,引用转载请注明出处,如有必要请联系作者。

                
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息