实训3.3——交换两变量的值
教学录像 光盘\chap3\实训3.3——交换两变量的值
编写程序,不使用其他中间变量,交换两个整型变量a和b的值。使用按位异或(^)交换两变量的值。使用异或操作置位两变量对应位不同的位置,并依次交叉操作,达到两值交换的功能,本例主要使用一个变量存储了两个变量信息的特性。
1. 需求分析
分析目标需求,程序中需要做到如下几条。
需求1:交换两个变量的值。
需求2:不使用中间变量。
2. 技术应用
根据C语言标准以及开发平台版本,完善各个需求模块。
对于需求1,按照C语言规则完成两变量值的交换,可以使用第三方变量。
对于需求2,规定不能使用中间变量,因此否定对需求1的操作,使用按位异或(^)运算符,完成操作。方法为:首先将变量a和b作异或操作,将结果赋给a,然后将b与a作异或操作,并将结果赋给b,重复上述操作,完成。
通过上述分析,写出完整的程序如下。
程序清单3.3:ExchangeTwoVariable.c
01 #include<stdio.h> 02 main() 03 { 04 int a=0; 05 int b=0; 06 printf("请输入两变量的值:\n"); 07 printf("a="); 08 scanf("%d", &a); //输入a的值 09 printf("b="); 10 scanf("%d", &b); //输入b的值 11 printf("您输入的变量值为:a=%d, b=%d\n", a, b); 12 printf("现在开始转换\n"); 13 a=a^b; //交换a与b的值 14 b=b^a; 15 a=a^b; 16 printf("转换完毕!\n"); 17 printf("a=%d, b=%d\n", a, b); 18 }
程序第13行将a和b进行异或操作,将结果赋给a。程序第14行将重新赋值过的a和b进行异或,将结果赋给b,程序第15行将重新赋值的b和a进行异或,将结果重新赋给a,完成交换操作。程序运行结果为:
请输入两变量的值:
a = 5
b = 7
您输入的变量值为: a=5, b=7
现在开始转换
转换完毕!
a=7, b=5
程序使用按位异或(^)实现了不借助中间变量交换两变量值的操作,运算过程以及运算中各变量值的变化如下。
执行第13行a=a^b操作:
a 00000000000000000000000000000101 b 00000000000000000000000000000111 ^ ------------------------------------------------------ a=a^b,结果为:a=2 00000000000000000000000000000010
执行第14行b=b^a操作:
b 00000000000000000000000000000111 a 00000000000000000000000000000010 ^ ------------------------------------------------------ b=b^a,结果为:b=5 00000000000000000000000000000101
执行第15行a=a^b操作:
a 00000000000000000000000000000010 b 00000000000000000000000000000101 ^ ------------------------------------------------------ a=a^b,结果为:a=7 00000000000000000000000000000111
随·堂·实·训3.3
不使用按位异或(^)运算符,使用算术运算符交换两变量的值,且同样不使用中间变量。
提示:
(1)使用算术运算+和-。
(2)例如:x=x+y; y=x-y; x=x-y。
修改程序,验证是否能够满足要求。
4. 按位取反(~)
按位取反运算符(~)是一元运算符,一般形式为:
~操作对象
一般在运算符和操作对象间没有空格。按位取反操作是将操作对象各位取反,即原来为1的位变成0,原来为0的位变成1。例如:
short i = 0xFF11;
i=~i;
运算过程如下。
i 1111111100010011 ~ --------------------------- i=~i,结果为:i=0x00EE 0000000011101100
按位取反操作主要用于间接地构造一个数,以增强程序的可移植性。
5. 按位左移(<<)
按位左移(<<)的一般形式为:
操作对象 << 左移位数
按位左移(<<)运算符是使操作对象的各位左移,低位补0,高位溢出。其中,操作对象和左移位数只能是整型或字符型。若左移运算过程中,移出的数据位不是1,则相当于乘法操作,每左移一位,相当于原值乘2,左移n位,即相当于原数乘以2n。
6. 按位右移(>>)
按位右移(>>)的一般形式为:
操作对象 >> 右移位数
按位右移(>>)运算符是使操作对象的各位右移,高位补0,低位舍弃。与左移类似,操作对象和右移位数只能是整型或字符型。右移运算相当于算术除运算,每右移一位,相当于原值除以2,右移n位,即相当于原数除以2n。