变态考题之不创建中间变量交换两变量的值的方法

不创建中间变量交换两变量的值

一般我们都是直接创建一个中间变量来达到交换两变量值的效果,我们在平时写项目的时候也是这样。但有的考题不让你有中间变量,这是为了考察思维能力和一些符号运用的熟悉度。
下面是创建中间变量的一个解法
#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;
}

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值