编程技巧:使用异或操作符(XOR)交换两数值
异或(exclusive OR)作为4种逻辑操作符之一,相对其他3种(OR/AND/NOT)来说,出场的次数非常少,是因为在日常开发中能用到它的场景本来就不多。对笔者来说,目前接触到场景只有交换两个数值时才会用到。
Java Code:
int a = 5;
int b = 95;
System.out.println(a + ", " + b); a ^= b;//等价于 a = a ^ b;
b ^= a;
a ^= b;
System.out.println(a + ", " + b); /*
* output:
* 5, 95
* 95, 5
*/
具体例子:冒泡排序
public static int[] bubbleSort(int[] input){
for(int i = input.length - 1; i > 0; i--){
for(int j = 0; j < i; j++){
if(input[j] > input[j + 1]){
input[j] ^= input[j + 1];
input[j + 1] ^= input[j];
input[j] ^= input[j + 1];
}
}
}
return input;
}
注意:
- 任何数与0进行异或计算,结果为其自身;
- 任何数与自己进行异或计算,结果为0;
- Java中仅能对byte, short, int或long这4种整数类型(带正负号)进行异或运算,其他类型包括char都不允许(编译错误);
- 第1和第2点Java中不用担心,因为Java中对两个整形变量的异或运算并不是进行数值上的计算,而是对变量的内存地址的交换,因此不存在这两个问题。
使用场景:
对笔者来说,使用该写法的场景只有一个:笔试时的算法题目。这是从避免潜在的不必要的沟通问题方面来考虑。
原理:
逻辑操作符的本质就是对两个二进制数,在单个位级别(bit)的操作。在Java中,由于其他3种已经用于对boolean进行运算,所以剩下异或可以用于位运算。
举最简单的例子来说明,对于两个1bit的二进制数A和B、及它们的异或运算结果C(0或1)来说,在得知任何两个数(AB/AC/BC)的情况下,最后一个数是明确的。
所以
a ^= b;// a=a^b 得出c,并赋值给a,即此时a=c;
b ^= a;// b=a^b 由于此时a=c,所以实际上是c^b得到a,并赋值给b;
a ^= b;// a=a^b 此时b=a,a=c 所以实际上是a^c得到b,并赋值给a,完成a与b的交换
编程技巧:使用异或操作符(XOR)交换两数值的更多相关文章
- C语言位操作--不用中间变量交换两数值
1.使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = ...
- JavaScript中交换两个变量的值得三种做法(代码实现)
javascript在编程时经常会涉及到如何交换两个变量的值,例如常见的冒泡排序,快速排序等:下面我讲根据自己近期所学总结几种常见的交换两个变量值的方法: 方法一:借助第三方变量交换两个变量的值 va ...
- 【剑指offer】不使用新变量,交换两个变量的值,C++实现
# 题目 不使用新变量,交换两个变量的值. # 思路 方法一:使用加减法操作,交换两个变量的值. A = A+B B = A-B A = A-B 方法二:使用异或运算,交换两个变量的值 A = A^B ...
- 深入理解C#:编程技巧总结(二)
原创文章,转载请注明出处! 以下总结参阅了:MSDN文档.<C#高级编程>.<C#本质论>.前辈们的博客等资料,如有不正确的地方,请帮忙及时指出!以免误导! 在上一篇 深入理解 ...
- 关于Python的10大实用编程技巧
Python 是一种通用的脚本开发语言,比其他编程语言更加简单.易学,其面向对象特性甚至比Java.C#..NET更加彻底,因此非常适合快速开发. Python 已经成为最受欢迎的程序设计语言之一 ...
- java命名规范和编程技巧
一个好的java程序首先命名要规范. 命名规范 定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,方便维护等作用 Package 的命名 Package 的名字应该都是由一个小写 ...
- 无插件Vim编程技巧
无插件Vim编程技巧 http://bbs.byr.cn/#!article/buptAUTA/59钻风 2014-03-24 09:43:46 发表于:vim 相信大家看过<简明Vim教程& ...
- 【机器学习】神经网络实现异或(XOR)
注:在吴恩达老师讲的[机器学习]课程中,最开始介绍神经网络的应用时就介绍了含有一个隐藏层的神经网络可以解决异或问题,而这是单层神经网络(也叫感知机)做不到了,当时就觉得非常神奇,之后就一直打算自己实现 ...
- 无插件VIM编程技巧(网摘)
无插件VIM编程技巧 原文出处:[陈皓 coolshell] 相信大家看过<简明Vim教程>也玩了<Vim大冒险>的游戏了,相信大家对Vim都有一个好的入门了.我在这里把我日常 ...
随机推荐
- erwin逆向工程,logical模型列名修改为中文
逆向工程,应该选择physical template,这样拷贝到logical/physical 模型中,才可以将logical模型的列名修改为中文.
- RabbitMQ 之 订阅模式 Publish/Subscribe
模型图 我们之前学习的都是一个消息只能被一个消费者消费,那么如果我想发一个消息 能被多个消费者消费,这时候怎么办? 这时候我们就得用到了消息中的发布订阅模型 在前面的教程中,我们创建了一个工作队列,都 ...
- 用svg实现不规则形状
像这种弧形,用纯html和css很难写,但是用svg就简单多了. 可以用作图工具画出一个弧形,然后导成svg格式.在页面中,下面的白块就是div+svg构成 mixin svgCard(...cont ...
- HTML5 history API,创造更好的浏览体验
HTML5 history API有什么用呢? 从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残 ...
- Android Fragment解析(下)
今天被人问到了什么是Fragment,真是一头雾水,虽然以前也用到过,但不知道它是叫这个名字,狂补一下. 以下内容来自互联网,原文链接:http://blog.csdn.net/lmj62356579 ...
- 1-17-Linux中计划任务与日志的管理
本节所讲内容: 1-1 Linux中的计划任务 1-1-1 at计划任务的使用 1-1-2 cron 计划任务的使用 1-1 Linux服务器的日志管理 1-1-1 日志的种类和记录的方式 1-1-2 ...
- word2016_添加标题和目录
标题 开始->标题(层级可选) 目录 引用->目录->自动目录
- Spring3.0 核心jar包详解
org.springframework.aop 包含在应用中使用Spring的AOP特性时所需的类. org.springframework.asm Spring独立的ASM程序, Spring ...
- mysql 5.1.71升级到5.6.30
mysql 5.1.71升级到5.6.30 mysqldump -h主机名 -P端口 -u用户名 -p密码 (–database) 数据库名 > 文件名.sql 备份MySQL数据库的命令 my ...
- vue踩坑之旅 -- computed watch
vue踩坑之旅 -- computed watch 经常在使用vue初始化组件时,会报一些莫名其妙的错误,或者,数据明明有数据,确还是拿不到,这是多么痛苦而又令人忍不住抓耳挠腮,捶胸顿足啊 技术点 v ...