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,右移在左端补符号位)
不过归根结底,使用位运算是比较偏的一种方法,大家以后写程序,要交换数字的时候,还是安安分分地创建一个临时变量吧~~~
- C语言交换两个变量(不创建临时变量)(位运算简介)
- 交换两个值,不用临时变量(C位运算)
- 【c语言】 交换两个整形变量的值(要求不创建临时变量)
- C语言 不使用临时变量交换两个数
- C语言小编程之不创建临时变量,交换两个数的值
- C语言不创建临时变量,交换两个整型的值
- 交换两个数的内容的比较(分为创建临时变量和不创建临时变量两种情况)
- 不创建临时变量,交换两个变量的值
- 不创建临时变量交换两个变量的内容
- 不创建临时变量,交换两个变量的值
- C语言实现两个整形变量的值的交换,不使用临时变量
- [C语言]不允许创建临时变量,交换两个变量的内容
- 两个数字交换(不使用临时变量)
- 交换变量(不允许创建临时变量)
- (1.1.2)C的|、||、&、&&、异或、~、!运算 (交换两个值,不用临时变量)
- 不创建临时变量,交换两个数的值
- 不创建临时变量,交换两个数的内容
- 不创建临时变量交换两个数的值
- ANSYS Workbench的小技巧
- 利用pandas模块读取csv文件和excel表格,并用matplotlib画图
- lxml库 xpth使用
- poj2796 feel good 单调栈 前后延伸
- h5+ 总结
- C语言交换两个变量(不创建临时变量)(位运算简介)
- MySQL索引专题一 认识索引
- LVS工作原理的简单理解
- 根据字体的中文名 获取 字体的路径 和 英文名
- 钻石与价格预测
- 浅析JVM内存模型
- 杭电problem6033- Add More Zero
- 第二次开始
- java中类和类之间的关系