C语言交换两个变量(不创建临时变量)(位运算简介)

来源:互联网 发布:云之家网络平台 编辑:程序博客网 时间:2024/05/21 12:40

今天呢,我来分享代码了。

这是在学习过程中的一次作业,题目为“设计一个程序,交换两个变量。“

显然,一般人第一时间想到的就是建立一个变量,用于存储数据,然后对两个变量进行赋值交换。

于是就有下面的代码:

#include <stdio.h>#include <stdlib.h>int main(){int i = 0;int j = 0;int t = 0;printf("请输入i的值:\n");scanf("%d",&i);printf("请输入j的值:\n");scanf("%d",&j);printf("您输入的值为:\ni=%d和j=%d\n",i,j);t=i;i=j;j=t;printf("交换后得知为:\ni=%d和j=%d\n",i,j);system("pause");return 0;}

这个没什么好说的,因为每一个C语言的初学者都会写这一个程序。

而另外还有人会想到用加减法去解决这个问题。

#include <stdio.h>#include <stdlib.h>int main(){int i = 0;int j = 0;printf("请输入i的值:\n");scanf("%d",&i);printf("请输入j的值:\n");scanf("%d",&j);printf("您输入的值为:\ni=%d和j=%d\n",i,j);i+=j;j=i-j;i-=j;printf("交换后得知为:\ni=%d和j=%d\n",i,j);system("pause");return 0;}

可是这个程序在i或者j赋值过大的时候有可能会导致溢出。


而今天我get到了个新技能,就是异或。

下面我们来看程序:

#include <stdio.h>#include <stdlib.h>int main(){int i = 0;int j = 0;printf("请输入i的值:\n");scanf("%d",&i);printf("请输入j的值:\n");scanf("%d",&j);printf("您输入的值为:\ni=%d和j=%d\n",i,j);i=i^j;j=i^j;i=i^j;printf("交换后得知为:\ni=%d和j=%d\n",i,j);system("pause");return 0;}


在此,我先解释一下异或:C语言中的异或,用^表示,表示的是按位异或。

“按位异或”中,“位”就是指每一个比特位,“异或”的意思就是相同的比特位记为0,不同的比特位记为1。

举个例子,5和15异或,5的二进制代码为0101,15的二进制代码为1111,按位异或,相同位记0,不同位记1,得到1010,表示10,所以5^15=10。

而在上方代码中,假设i为5,j为15,那在语句“i=i^j;j=i^j;i=i^j;”中。

第一个语句执行之后,i=10=(1010)2,j=15=(1111)2

第二个语句执行之后,i=10=(1010)2,j=5=(0101)2

第三个语句执行之后,i=15=(1111)2,j=5=(0101)2

现在看来,i和j是不是就换过来了呢?


从这个程序,我们可以联想到,是否还有别的位运算呢?

当然有

位运算名称表达式按位与a&b按位或a|b按位异或a^b按位取反~a左移a<<n(左移n位)右移a>>n(右移n位)按位与(“&”):有1取1,没1取0。

按位或(“|”):有0取0,没0取1。

按位异或(“^”):相同取0,不同取1.

按位取反(“~”):0换为1,1换位0。

左移/右移(“<<”/“>>”):把二进制数最左/最右端的数丢失,再在另一端补数字(左移在右端补0,右移在左端补符号位)


不过归根结底,使用位运算是比较偏的一种方法,大家以后写程序,要交换数字的时候,还是安安分分地创建一个临时变量吧~~~

阅读全文
0 0
原创粉丝点击