不创建中间变量交换两变量的值
一般我们都是直接创建一个中间变量来达到交换两变量值的效果,我们在平时写项目的时候也是这样。但有的考题不让你有中间变量,这是为了考察思维能力和一些符号运用的熟悉度。
下面是创建中间变量的一个解法
#include<stdio.h>
int main()
{
int a=8;
int b=6;
int c;//直接创建中间变量
printf("交换之前:a=%d,b=%d\n",a,b);
c=a;
a=b;
b=c;//实现交换
printf("交换之后:a=%d,b=%d\n",a,b);
return 0;
}
运行结果
解法一:思维解法
思路方法请看注释
#include<stdio.h>
int main()
{
int a=8;
int b=6;
printf("交换之前:a=%d,b=%d\n",a,b);
a=a+b;//先计算总和
b=a-b;//总和减掉b则是a原来的值赋给b
a=a-b;//a的值被赋给了b,总和减去b就变成了原来b的值
printf("交换之后:a=%d,b=%d\n",a,b);
return 0;
}
这个方法有一个缺陷,就是a,b的和不能超过a的类型范围。
运行结果
解法二:操作符解法
使用异或操作符(^),这个操作符是补码计算,详情请看下面注释
#include<stdio.h>
int main()
{
int a=8;
//a的补码:00000000 00000000 00000000 00001000
int b=6;
//b的补码:00000000 00000000 00000000 00000110
printf("交换之前:a=%d,b=%d\n",a,b);
a=a^b;
//a补码: 00000000 00000000 00000000 00001000
//b补码: 00000000 00000000 00000000 00000110
//异或后:00000000 00000000 00000000 00001110
b=a^b;
//a补码: 00000000 00000000 00000000 00001110
//b补码: 00000000 00000000 00000000 00000110
//异或后:00000000 00000000 00000000 00001000
//b的值变成8
a=a^b;
//a补码: 00000000 00000000 00000000 00001110
//b补码: 00000000 00000000 00000000 00001000
//异或后:00000000 00000000 00000000 00000110
//a的值变成6
printf("交换之后:a=%d,b=%d\n",a,b);
return 0;
}
缺点:
1.只能用于整数的交换
2.代码的可读性差
3.代码的执行效率低于使用三个变量
运行结果
知识点补充:
1.原码,反码,补码
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位最高位的⼀位是被当做符号位,剩余的都是数值位。
正整数的原、反、补码都相同。
负整数的三种表示方法各不相同。
1.原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。
2.反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
3.补码:反码+1就得到补码。
举例:以int类型举例,int一般为4个字节
1的原、反、补码都相同
00000000 00000000 00000000 00000001
-1原码
10000000 00000000 00000000 00000001
-1反码
111111111 111111111 111111111 111111110
-1的补码
111111111 111111111 111111111 111111111
2.操作符:&、|、^
1.&,(按位与)相同位上补码都为1才是1,有0则为0,举例
#include<stdio.h>
int main()
{
int a=8;
//a的补码:00000000 00000000 00000000 00001000
int b=6;
//b的补码:00000000 00000000 00000000 00000110
int c=a & b;
//a补码: 00000000 00000000 00000000 00001000
//b补码: 00000000 00000000 00000000 00000110
//按位与:00000000 00000000 00000000 00000000
//c的值为0
printf("%d\n",c);
return 0;
}
2.|,(按位或),有1则为1,全0才为0,举例
#include<stdio.h>
int main()
{
int a=8;
//a的补码:00000000 00000000 00000000 00001000
int b=6;
//b的补码:00000000 00000000 00000000 00000110
int c=a | b;
//a补码: 00000000 00000000 00000000 00001000
//b补码: 00000000 00000000 00000000 00000110
//按位或:00000000 00000000 00000000 00001110
//c值为14
printf("%d\n",c);
return 0;
}
3.^,(按位异或),相同为0,相反为1
#include<stdio.h>
int main()
{
int a=8;
//a的补码:00000000 00000000 00000000 00001000
int b=6;
//b的补码:00000000 00000000 00000000 00000110
int c=a ^ b;
//a补码: 00000000 00000000 00000000 00001000
//b补码: 00000000 00000000 00000000 00000110
//异或后:00000000 00000000 00000000 00001110
//c的值为14
printf("%d\n",c);
return 0;
}