C语言程序设计案例精粹
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

实训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