Java千问:Java位运算经典应用(二)
接上篇 三、不借助中间变量交换两个变量的值 通常情况下,我们要交换两个变量的值都按如下步骤操作: 这种操作方式不难理解,实现交换变量值的关键点就在于中间变量c。而现在的题目要求是不借助中间变量来交换a和b的值。如果不使用位运算的方式,同样可以做到不借助中间变量交换两个变量的值,其实现过程如下。 为了讲解方便,我们把最初a与b的值称之为原始a和原始b,3行代码就是3步操作: 第1步:把原始a与原始b相加的和存储到变量a中,变量b的值暂时没有发生变化。 第2步:用这个和减去原始b,再赋值到变量b中,经过这一步运算,变量b中就保存了原始a的值。 第3步:用原始a、b之和减去原始a的值,就得到原始b,并且把这个值保存到变量a中。 通过以上3步就实现了a、b两个变量在不借助中间变量的情况下进行值的交换。这种算法虽然没有借助中间变量,但有一个问题是如果a和b都是较大的数,在做第1步操作的时候就有可能出现两值相加的和超出int类型的最大值,产生溢出的现象,从而导致后面的运算全部出错。 而我们用位运算的方式实现交换,就不存在这个问题了。具体代码如下: 讲述这段代码之前,先回顾一个运算规律,那就是: a^b^b的运算结果等于a 。对此运算规律有疑义,请阅读《 Java千问:Java语言位运算符详解 》一文。为了表述方便,我们把a^b的操作称之为”用b对a加密”,之所以这么称呼