大家好,为了进一步吸收并掌握所学的知识,所以我决定每次学习后,在博客把它记录下来供大家参考。今天给大家带来的题目是:现有两个整形变量a、b,如何不创建第三个变量的情况下交换a、b变量的值呢?
大部分人应该第一时间就能想到创建tmp变量,然后两两交换。但是这并不符合题目要求啊?那该如何解决这个问题呢?这里我们得用到“数 码”(数学思维和代码)结合的思想。我们能不能用数学上的运算符加减乘除给变量重新赋值来实现变量值的交换呢?
首先我们把a+b(a*b)赋值给a,再把a-b(a/b)的值赋值给b,最后把a-b(a/b)的值赋值给a,这样不就实现了吗?OK,理论成立,咱们来实践一下。
#include<stdio.h>
int main() {
int a = 5, b = 3;
printf("a=%d,b=%d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("a=%d,b=%d\n", a, b);
return 0;
}
运行结果如下
如果a、b的值都为负,或者一正一负该代码也是可以实现的,读者可以自己用vs 或者devc++试一下。同理如果用乘除运算
#include<stdio.h>
int main() {
int a = 5, b = -3;
printf("a=%d,b=%d\n", a, b);
a = a * b;
b = a / b;
a = a / b;
printf("a=%d,b=%d\n", a, b);
return 0;
}
运行结果如下
看着好像解决问题了,但总感觉有些怪怪的,嗯.......哦~~~!a和b是整型变量,只能存储 的整数,如果数太大,a+b和a*b赋值给整型a肯定会溢出,代码自然就寄了。
难道就没有其他的方法了吗?难道真的要止步于此了吗?再想想肯定会有办法的…….....................................哦~~~~~!既然能用数学的运算符,那c语言有没有运算符能实现这样的效果呢?
在学习c语言运算符那一章后,我们知道了&(按二进制位与)、|(按二进制位或)、^(按二进制位异或)还有<<、>>(左右移运算符)。&是都为1才是1,否则为0;|是有一个为1则结果为1;^是相同为0相异为1例如: 1&3就是 0001( 省略前28个0) 和 0011(省略前28个0)位与,结果为0001(省略前28个0),| 和^同理。
那么这三个符号哪个能实现同上代码相同的效果呢?
有意思的是,你会发现一个数a^b然后再^b,答案还是a,而其他的就不行。代码和执行结果如下,我是直接打印表达式,供读者参考,剩下赋值逻辑请读者自行完成。
#include<stdio.h>
int main() {
int a = 5, b = 3;
printf("a=%d,b=%d", a ^ b ^ a, b ^ a ^ b);
return 0;
}
那么在这里我想给大家留下一道题目,请给整型变量随机赋值(不超过整型变量存储范围内),然后输出它的二进制位有多少个1。
明天我会再发一个帖子来分享分享我的思路以及代码,跟着花城,每天带你进步一点点,哦耶!