小技巧–使用异或来替换原本的常量交换

场景重现

我们在平时写代码的时候,倘若我们要交换ab的值,是不是经常会用到下面这个代码?

int temp = a;
a = b;
b = temp;

这个算是十分基本的交换方法,被人津津乐道。

但,从优化的角度,有没有想过,不去使用temp这个变量呢?

那么,不用变量如何交换呢?

就要使用到我们今天的主角–异或运算了。

先打个结论,刚才那行代码是完全等于下面这些代码的:

a = a ^ b;
b = a ^ b;
a = a ^ b;

为什么呢?请听我娓娓道来。

先来说一下异或运算

异或运算就是一种对二进制的一种运算。相同得 0 ,不同得 1。例:

1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
1 ^ 1 = 0

如果是两个数的运算,就是:

4 ^ 5 =4       0100
5       0101------0001

又被称为不进位的相加。

同时又衍生出:

 n ^ n = 0n ^ 0 = n

同时异或满足结合律。

铺垫了这么多,该说一下为什么了。

我们把a的值设为 x , b的值设为 y。于是上面的变为:

a = a ^ b;  //此时a = x ^ y  b = y
b = a ^ b;  //此时a = x ^ y  b = x ^ y ^ y = x
a = a ^ b;  //此时a = x ^ y ^ x = y  b = x

你会惊讶的发现 a 和 b 调换完了。

这就是异或的魅力。

注意: 如果 a 和 b 指向的是同一个内存地址,那么这种方法就存在弊端,就会将原来的 a 和 b 都重置为0.

位运算详解以及有关的练习点击这里:“只出现一次的数字”系列 剑指offer–位运算学习(一)

小技巧--使用异或来替换原本的常量交换相关推荐

  1. C语言zh字符串指针的大小,C语言的一些小技巧,小知识

    1.用if(!strcmp(s1, s2)) 比较两个字符串等值,是否是个好风格? 这并不是个很好的风格, 虽然这是个流行的习惯用法.如果两个字符串相等, 这个测试返回为真, 但! ("非& ...

  2. Java中代码优化的30个小技巧

    1.用String.format拼接字符串 String.format方法拼接url请求参数,日志打印等字符串. 但不建议在for循环中用它拼接字符串,因为它的执行效率,比使用+号拼接字符串,或者使用 ...

  3. Vim替换小技巧(兼浅谈Vim哲学)

    想必用过Vim的人都知道,在Vim里面,以下命令可以替换当前文件的内容: :[range]s/{要被替换的模式}/{替换的内容}/[flags] 其中range指定替换命令生效的范围.flags指定替 ...

  4. linux 文件转换ascii,linux 小技巧(查找替换文件中的ascii编码字符)

    这里纪录一些linux下用到的小技巧,以免遗忘 在linux中经常碰见各种文件处理.最常用的就是替换文件中的某些字符.常见字符替换还是很容易完成.但是有些不可见字符以及ascii编码字符等等都无法直接 ...

  5. Python自动化小技巧01——清洗并替换文件名称

    本次开启一个新栏目,主要是使用Python的一些小技巧和方法,去简化生活中的一些重复性的劳动.这些py文件可以当做脚本使用,代码写好后可以全自动,点一下运行就能使用. 这些技巧和方法不涉及数据科学领域 ...

  6. 分享几个 SpringBoot 实用的小技巧

    作者:crossoverJie 来源:crossoverJie 前言 最近分享的一些源码.框架设计的东西.我发现大家热情不是特别高,想想大多数应该还是正儿八经写代码的居多:这次就分享一点接地气的: S ...

  7. OI常用的常数优化小技巧

    注意:本文所介绍的优化并不是算法上的优化,那个就非常复杂了,不同题目有不同的优化.笔者要说的只是一些实用的常数优化小技巧,很简单,虽然效果可能不那么明显,但在对时间复杂度要求十分苛刻的时候,这些小的优 ...

  8. javascript取随机数_一些常用Javascript 小技巧,值得你关注

    今天笔者整理了一份自己最近用到的一些小技巧分享给大家,虽然都是基础技术,不过在某些特殊时刻还蛮有用的,不至于加载一堆体积庞大的第三方库.今天笔者用本文归纳一下分享给大家.本篇文章主要包含以下内容: 产 ...

  9. IDEA Intellij小技巧和插件

    博客分类: 编程基础 ideavim  使用IDEA Intellij已有两年,在此罗列一下在实践中觉得能有效提升开发效率的一些小技巧和插件. 1. 重设移动键  方向键和Home/End键离基键太远 ...

最新文章

  1. 1分钟搭建极简mock server
  2. DeepMind发布最新原始音频波形深度生成模型WaveNet,将为TTS带来无数可能
  3. [云炬创业基础笔记]第七张创业资源测试11
  4. Leetcode-Median of Two Sorted Arrays
  5. 如何启用计算机的远程服务,远程桌面服务,教您怎么打开远程桌面服务
  6. 博客系统。集成调试平台,支持类结构/jar结构预览、支持方法调试和监听、支持修改类字段(变量、常量、枚举)等
  7. 测试开发必备技能与成长路径
  8. 数维杯国际大学生数学建模挑战赛
  9. coreldrawx4缩略图显示不出来_CDR缩略图不显示怎么办?CorelDRAW缩略图不显示解决办法 - 优优下载站...
  10. kmeans-用户分层
  11. VMware Workstation 安装及配置HMC V8R860
  12. https证书、公钥、私钥、签名介绍
  13. 华为笔记本linux双系统,真的有必要吗?华为笔记本搭载双系统
  14. bugkuCTF---flag在index里
  15. mac 苹果电脑的睡眠与休眠,决待机耗电的问题,AddressBookSourceSync
  16. PostGIS中的常用函数
  17. 电信保温杯笔记——《统计学习方法(第二版)——李航》第17章 潜在语义分析
  18. 广义相对论基础【3】平移联络
  19. Oracle物化视图的使用总结
  20. 计算机进制转换界面,进制转换计算器

热门文章

  1. 闵可夫斯基距离—大白话篇幅[有错误的话请指教]
  2. HTML知识点总结(练习题)
  3. 前端HTML+CSS+JS+AJAX知识点
  4. 开发技巧-解决打开谷歌浏览器跳转问题
  5. IDEA中查找java文件所在的文件位置
  6. 微博HTML怎么改,微博发布后可以修改吗 已发布微博怎么重新编辑
  7. 计算机分辨率无法调整,电脑分辨率突然变小且无法调整的解决方法
  8. (已解决)Texmaker 编译latex文件后预览PDF显示字体模糊
  9. C++之类的组合(聚合)
  10. 采样坦克3含音色库-SampleTank v3.0.1 + Content WiN-MAC