C语言异或交换两个数的原理解析-大厂面试题:不使用第三变量交换两个数的值
常用操作交换两个数的值
常用的交换两个数值的方法一般是采用第三个变量,这种方法简单易懂,用代码举例
int main()
{//交换两个整形变量int a = 3;int b = 5;int c = 0;//第三个变量printf("交换前:a=%d b=%d\n", a, b);c = a;a = b;b = c;printf("交换后:a=%d b=%d\n", a, b);return 0;
}
这么简单的题目肯定不是面试官想要的,所以就引出了这次要讨论的内容:在不使用第三个变量的前提下交换两个变量的值。稍加思索也能给出解决方案
不使用第三变量
int main()
{int a = 3;int b = 5;printf("交换前:a=%d b=%d\n", a, b);a = a + b;//a放的是和,b还是原来的bb = a - b;//b得到原来的aa = a - b;//a得到原来的bprintf("交换后:a=%d b=%d\n", a, b);return 0;
}
这种算法看起来是解决了问题,但是还存在缺陷,使用加减法会导致溢出从而报错,出现隐患;还有进一步优化的空间 。
最优解决方案:异或
首先要介绍一个运算符^,按位异或运算符:相同为0不同为1
int main()
{int a = 3;//二进制:011int b = 5;//二进制:101printf("交换前:a=%d b=%d\n", a, b);//^是按位异或:相同为0不同为1// a = a^b;//此处a=110 b=101b = a^b;//此处a=110 b=011a = a^b;//此处a=101 b=011printf("交换后:a=%d b=%d\n", a, b);return 0;
}
注:括号内为二进制数值,标红的为中间值。
被交换数的值为3(011)和5(101),中间值是6(110),这样程序可看作:
a=3(011),b=5(101);
3(011)^5(101)=6(110)=a,此时:a=6(110),b=5(101);
6(110)^5(101)=3(011)=b,此时:a=6(110),b=3(011);
6(110)^3(011)=5(101)=a,此时:a=5(101),b=3(011);
异或交换的原理:
两个被交换数异或会得到一个中间值,两个被交换数中的任意一个和中间值异或就会得到另一个被交换数。
初始的状态: 此时a=被交换数3,b=被交换数5
第一次异或:3和5异或得到中间值6放到a里;
此时a=中间值6,b=被交换数5
第二次异或:5和中间值6异或得到另一个被交换数3放到b内,这时已经交换了一半;
此时a=中间值6,b=被交换数3
第三次异或:3和中间值6异或得到另一个被交换数5放到a内,此时交换完成;
此时a=被交换数5,b=被交换数3
C语言异或交换两个数的原理解析-大厂面试题:不使用第三变量交换两个数的值相关推荐
- 不用引入第三变量交换两个变量的值
前几天发现了一个问题:有人告诉我,要进行变量交换,就必须引入第三变量! 假设我们要交换a和b变量的值,如果写成 int a=5,b=10; a=b; b=a; 那么结果就是两个都是10,理由不言而喻. ...
- C++不借助第三变量交换两个变量的值
C++不借助第三变量交换两个变量的值 源代码: #include<iostream> using namespace std; int main(){int x,y;cout<< ...
- C语言三个数排序,普通方法及进阶(不引入第三变量交换数值法)
输入 三个整数a,b,c 输出 按从大到小的顺序输出 普通方法:将三个数大小情况全部列出 #include<stdio.h>int main() {int x,y,z;scanf(&quo ...
- 不使用第三变量交换两个变量的值
在 Java 中,经常会需要交换两个变量的值,我们一般是使用第三变量完成,比如 temp = a; a = b; b = temp; 这样的写法确实能达成目标,但因此而引入了第三变量,对资源的消耗增加 ...
- c语言不用第三变量,C语言中几种不用第三变量交换两值的方法
int main() { int a=3,b=4; int *p=(int *)malloc(sizeof(int)); *p=3; int *q=(int *)malloc(sizeof(int)) ...
- 在C语言上优雅地使用json - CSON原理解析
前言 json是目前最为流行的文本数据传输格式,特别是在网络通信上广泛应用,随着物联网的兴起,在嵌入式设备上,也需要开始使用json进行数据传输,那么,如何快速简洁地用C语言进行json的序列化和反序 ...
- c语言两个变量异或运算,C语言异或运算
C语言异或运算 位运算符家族中,最常用的,某过于异或运算符. 异或运算符是指: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1.即:0^0=0, 1^0=1, 0^1=1, 1^1= ...
- 不创建临时变量交换两个数,这才是高手
不创建临时变量交换两个数?这才是高手 1.基本介绍 1.代码编写 总结 1.基本介绍 交换两个数,想必大家都很熟悉,也很容易写出来就可以实现,即创建一个临时变量,就可以完成两个数的交换,然后更牛逼的大 ...
- C语言程序——两个变量交换
文章目录 前言 一.两个变量交换 二.程序实例 1.程序代码 2.运行结果 3.结果分析 三.拓展应用 总结 前言 结构化程序设计的三种结构是顺序结构.选择结构.循环结构,顺序结构是一种最简单.最常见 ...
最新文章
- c语言中很多中括号由外向里,浅谈C语言中的类型声明
- easy-mock本地部署成功,访问报错:EADDRNOTAVAIL 0.0.0.0:7300 解决方案
- golang红包算法
- 使用nodejs搭建HTTPS server
- C语言实现AES加密解密
- 动态切换数据源(spring+hibernate)
- jquery-ajax的同步与异步
- Android 程式开发:(二十)内容提供者 —— 20.6 自定义ContentProvider的使用
- ubuntu16.04下pycharm中无法使用中文输入法
- android 之 Dialog
- 一个简单帆软报表制作基础步骤
- 2、PM模块中的主数据
- 【Rust 笔记】08-枚举与模式
- IBM Spectrum LSF
- wamp5如何配置多个自定义域名访问本地不同的项目
- 数据结构:C#语言与面向对象技术(1)
- ila、dbg_hub、jatg时钟关系
- 怎样进行微信营销才比较好
- Android Studio开发(四)SQLite数据库的DAO标准CRUD操作模拟微信通讯录
- Cadence orcad 删除元件名称的下划线
热门文章
- 遇到QQ等非浏览器软件能正常上网打开但Edge等浏览器打不开的情况?
- eclipse中文乱码解决
- 红帽认证能做哪些方面工作?红帽认证好找工作吗?
- 苹果iOS 16如何显示WiFi密码【操作教程】
- 淘宝html 表格,Html中的table包括 caption、col、colgroup、thead、tfoot 以及 tbody
- selenium cookie 登录
- 廖雪峰python教程在哪看_为什么看不懂廖雪峰的Python学习教程?
- 第二代计算机用什么做外存存储器,第一,二代计算机的主存储器采用的是什么?...
- 基于VS2017编译配置GDAL教程
- 苹果数据记录之详细让人不寒而栗