常用操作交换两个数的值

常用的交换两个数值的方法一般是采用第三个变量,这种方法简单易懂,用代码举例

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语言异或交换两个数的原理解析-大厂面试题:不使用第三变量交换两个数的值相关推荐

  1. 不用引入第三变量交换两个变量的值

    前几天发现了一个问题:有人告诉我,要进行变量交换,就必须引入第三变量! 假设我们要交换a和b变量的值,如果写成 int a=5,b=10; a=b; b=a; 那么结果就是两个都是10,理由不言而喻. ...

  2. C++不借助第三变量交换两个变量的值

    C++不借助第三变量交换两个变量的值 源代码: #include<iostream> using namespace std; int main(){int x,y;cout<< ...

  3. C语言三个数排序,普通方法及进阶(不引入第三变量交换数值法)

    输入 三个整数a,b,c 输出 按从大到小的顺序输出 普通方法:将三个数大小情况全部列出 #include<stdio.h>int main() {int x,y,z;scanf(&quo ...

  4. 不使用第三变量交换两个变量的值

    在 Java 中,经常会需要交换两个变量的值,我们一般是使用第三变量完成,比如 temp = a; a = b; b = temp; 这样的写法确实能达成目标,但因此而引入了第三变量,对资源的消耗增加 ...

  5. c语言不用第三变量,C语言中几种不用第三变量交换两值的方法

    int main() { int a=3,b=4; int *p=(int *)malloc(sizeof(int)); *p=3; int *q=(int *)malloc(sizeof(int)) ...

  6. 在C语言上优雅地使用json - CSON原理解析

    前言 json是目前最为流行的文本数据传输格式,特别是在网络通信上广泛应用,随着物联网的兴起,在嵌入式设备上,也需要开始使用json进行数据传输,那么,如何快速简洁地用C语言进行json的序列化和反序 ...

  7. c语言两个变量异或运算,C语言异或运算

     C语言异或运算 位运算符家族中,最常用的,某过于异或运算符. 异或运算符是指: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1.即:0^0=0, 1^0=1, 0^1=1, 1^1= ...

  8. 不创建临时变量交换两个数,这才是高手

    不创建临时变量交换两个数?这才是高手 1.基本介绍 1.代码编写 总结 1.基本介绍 交换两个数,想必大家都很熟悉,也很容易写出来就可以实现,即创建一个临时变量,就可以完成两个数的交换,然后更牛逼的大 ...

  9. C语言程序——两个变量交换

    文章目录 前言 一.两个变量交换 二.程序实例 1.程序代码 2.运行结果 3.结果分析 三.拓展应用 总结 前言 结构化程序设计的三种结构是顺序结构.选择结构.循环结构,顺序结构是一种最简单.最常见 ...

最新文章

  1. c语言中很多中括号由外向里,浅谈C语言中的类型声明
  2. easy-mock本地部署成功,访问报错:EADDRNOTAVAIL 0.0.0.0:7300 解决方案
  3. golang红包算法
  4. 使用nodejs搭建HTTPS server
  5. C语言实现AES加密解密
  6. 动态切换数据源(spring+hibernate)
  7. jquery-ajax的同步与异步
  8. Android 程式开发:(二十)内容提供者 —— 20.6 自定义ContentProvider的使用
  9. ubuntu16.04下pycharm中无法使用中文输入法
  10. android 之 Dialog
  11. 一个简单帆软报表制作基础步骤
  12. 2、PM模块中的主数据
  13. 【Rust 笔记】08-枚举与模式
  14. IBM Spectrum LSF
  15. wamp5如何配置多个自定义域名访问本地不同的项目
  16. 数据结构:C#语言与面向对象技术(1)
  17. ila、dbg_hub、jatg时钟关系
  18. 怎样进行微信营销才比较好
  19. Android Studio开发(四)SQLite数据库的DAO标准CRUD操作模拟微信通讯录
  20. Cadence orcad 删除元件名称的下划线

热门文章

  1. 遇到QQ等非浏览器软件能正常上网打开但Edge等浏览器打不开的情况?
  2. eclipse中文乱码解决
  3. 红帽认证能做哪些方面工作?红帽认证好找工作吗?
  4. 苹果iOS 16如何显示WiFi密码【操作教程】
  5. 淘宝html 表格,Html中的table包括 caption、col、colgroup、thead、tfoot 以及 tbody
  6. selenium cookie 登录
  7. 廖雪峰python教程在哪看_为什么看不懂廖雪峰的Python学习教程?
  8. 第二代计算机用什么做外存存储器,第一,二代计算机的主存储器采用的是什么?...
  9. 基于VS2017编译配置GDAL教程
  10. 苹果数据记录之详细让人不寒而栗