编程技巧:使用异或操作符(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都有一个好的入门了.我在这里把我日常 ...
随机推荐
- poj3977 - subset - the second time - 暴力 + 二分
2017-08-26 11:38:42 writer:pprp 已经是第二次写这个题了,但是还是出了很多毛病 先给出AC代码: 解题思路: 之前在培训的时候只是笼统的讲了讲怎么做,进行二分对其中一边进 ...
- Linux 实用操作命令
1. ssh远程连接服务器命令 ssh [username@]hostname 2. 查看远程服务器近期登陆记录 last 3. 用户及其主目录的创建 1. useradd –d /home/lb ...
- jQuery实际案例②——三层轮播图
1.如图,这种轮播图需要实现的是,当鼠标移到2上时,第二张图片从右侧过来 2.需要注意的:①很明显这是通过改变z-index与left值来实现的: ②整体布局需注意,图与数值(1,2,3,4,5)两 ...
- springboot解决开发环境和生产环境不一样的配置问题
代码: application-dev.yml server: port: gril: cupSize: B age: application-prod.yml server: port: gril: ...
- [java]Stream API——map和flatMap的区别
map方法 map的含义为映射.是指对于Stream中包含的每一个元素使用给定的转换函数进行转换. map传入的Lambda表达式必须是Function实例,参数可以为任意类型,而其返回值也是任性类型 ...
- Mac OSX 如何在命令行中生成 md5、sha1、sha256 校验和
计算 MD5 校验和 md5 /tmp/hello.txt 计算 SHA-1 校验和 shasum -a 1 /tmp/hello.txt 计算 SHA-256 校验和 shasum -a 256 / ...
- 获取CPU和内存的使用率
1.获取CPU的使用率 主要就是一个计算. int CUseRate::GetCPUUseRate() //获取CPU使用率 { ; FILETIME ftIdle, ftKernel, ftUser ...
- HDU 4825 Trie树 异或树!
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- mbstring.so下载安装
linux下安装: $:cd /php7.0/ext/mbstring 切换到源码包目录下 $:/usr/local/php/bin/phpize 执行这句 $:./configure –with-p ...
- oracle数据库简单的导入导出操作
一.数据库导出 1.导出用户名/密码,,导出用户名为test_expdp.导出路径默认为oracle中的dpdump文件中 expdp test_expdp/test_expdp@orcl direc ...