编程技巧:使用异或操作符(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都有一个好的入门了.我在这里把我日常 ...
随机推荐
- Mac下配置Hadoop环境
下载Hadoop(我下载的是2.8.0版本) 点击此处下载 下载后,使用 tar -zxvf tar包名 解压tar包,解压完成后有这样一个文件出现 修改Hadoop的配置文件 需要修改的配置文件在H ...
- 从0开始 数据结构 字典树 hdu1251
字典树 知识补充 '\0'和'\n'的区别 '\0' 是一个字符串的结尾 '\n' 是换行符 gets 和 scanf 的区别 gets()函数总结: gets() 从标准输入设备读取字符串,以回车结 ...
- SecureCRT在mac下无法输入中断命令
mac下输入Ctrl +C无法中断程序,这个问题困扰了我好久,大概有很长一段时间我都是使用kill 进程的方式来代替中断: ps aux | grep python kill -9 pid 今天终于发 ...
- Build hadoop 2.5.2 with Java8
mvn clean package -Pdist,native -DskipTests -Dtar -Dmaven.javadoc.skip=true
- PHP XML Parser 函数
PHP XML Parser 简介 XML 函数允许您解析 XML 文档,但无法对其进行验证. XML 是一种用于标准结构化文档交换的数据格式.您可以在我们的 XML 教程 中找到更多有关 XML 的 ...
- C++(三十) — this 指针
1.如何区分多个对象调用同一个类函数? 类外部访问类成员,必须用对象来调用.一个类的所有对象在调用的成员函数,都执行同一段代码,那成员函数如何区分属于哪个对象呢? 在对象调用成员函数时,除接收实参外, ...
- 2016ACM/ICPC亚洲区沈阳站H - Guessing the Dice Roll HDU - 5955 ac自动机+概率dp+高斯消元
http://acm.hdu.edu.cn/showproblem.php?pid=5955 题意:给你长度为l的n组数,每个数1-6,每次扔色子,问你每个串第一次被匹配的概率是多少 题解:先建成ac ...
- 从零开始搭建webpack+react开发环境
环境主要依赖版本 webpack@4.8.1 webpack-cli@2.1.3 webpack-dev-server@3.1.4 react@16.3.2 babel-core@6.26.3 bab ...
- react 子组件改变父组件状态
class Father extends Component { construtor(props){ super(props); this.state={ ...
- express中的错误处理
错误处理 定义错误处理中间件和定义其他中间件一样,除了需要 4 个参数,而不是 3 个,其格式如下 (err, req, res, next).例如: app.use(function(err, re ...