C语言交换两个变量(不创建临时变量)(位运算简介)
2017-07-26 11:04
218 查看
今天呢,我来分享代码了。
这是在学习过程中的一次作业,题目为“设计一个程序,交换两个变量。“
显然,一般人第一时间想到的就是建立一个变量,用于存储数据,然后对两个变量进行赋值交换。
于是就有下面的代码:
这个没什么好说的,因为每一个C语言的初学者都会写这一个程序。
而另外还有人会想到用加减法去解决这个问题。
可是这个程序在i或者j赋值过大的时候有可能会导致溢出。
而今天我get到了个新技能,就是异或。
下面我们来看程序:
在此,我先解释一下异或: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是不是就换过来了呢?
从这个程序,我们可以联想到,是否还有别的位运算呢?
当然有
按位与(“&”):有1取1,没1取0。
按位或(“|”):有0取0,没0取1。
按位异或(“^”):相同取0,不同取1.
按位取反(“~”):0换为1,1换位0。
左移/右移(“<<”/“>>”):把二进制数最左/最右端的数丢失,再在另一端补数字(左移在右端补0,右移在左端补符号位)
不过归根结底,使用位运算是比较偏的一种方法,大家以后写程序,要交换数字的时候,还是安安分分地创建一个临时变量吧~~~
这是在学习过程中的一次作业,题目为“设计一个程序,交换两个变量。“
显然,一般人第一时间想到的就是建立一个变量,用于存储数据,然后对两个变量进行赋值交换。
于是就有下面的代码:
#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位) |
按位或(“|”):有0取0,没0取1。
按位异或(“^”):相同取0,不同取1.
按位取反(“~”):0换为1,1换位0。
左移/右移(“<<”/“>>”):把二进制数最左/最右端的数丢失,再在另一端补数字(左移在右端补0,右移在左端补符号位)
不过归根结底,使用位运算是比较偏的一种方法,大家以后写程序,要交换数字的时候,还是安安分分地创建一个临时变量吧~~~
相关文章推荐
- 【c语言】 交换两个整形变量的值(要求不创建临时变量)
- C语言不创建临时变量,交换两个整型的值
- 【c语言】 交换两个整形变量的值(要求不创建临时变量)
- C语言 不允许创建临时变量,交换两个数的内容
- 【c语言】不允许创建临时变量,交换两个数的内容
- C语言实现 不允许创建临时变量,交换两个数的内容
- 不创建临时变量,交换两个变量的值
- C语言实现两个整形变量的值的交换,不使用临时变量
- 1. 给定两个整形变量的值,将两个值的内容进行交换。 2. 不允许创建临时变量,交换两个数的内容(附加题) 3. 求10 个整数中最大值。 4. 写一个函数返回参数二进制中 1 的个数
- 不允许创建临时变量交换两个变量的内容
- 给定两个整形变量的值,在不创建临时变量的前提下,交换两个数的内容
- C语言_不创建临时变量,交换两个数的内容
- 不创建临时变量交换两个变量的内容
- C语言中不允许创建临时变量,交换两个数的内容
- C语言小编程之不创建临时变量,交换两个数的值
- 为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
- 不允许创建临时变量,来交换两个变量
- 交换两个值,不用临时变量(C位运算)
- (1.1.2)C的|、||、&、&&、异或、~、!运算 (交换两个值,不用临时变量)
- C语言中不允许创建临时变量,交换两个数的内容