Java基础知识之位运算--两变量值交换方法

8 篇文章 0 订阅
8 篇文章 0 订阅

定义两个变量:

int a = 1;

int b = 2;

现在要把a和b的值交换,一般我们最先想到的方法就是:

先定义一个中间变量:

int  c ;

然后开始交换:

c = a;

a = b;

b = c;

这样就交换完毕了。

在上一种交换方法中必须定义一个中间变量才能完成交换功能,这样就会多占用内存。那么有木有不用新建变量就能完成交换呢?

第二种方法就是不用定义中间变量就能完成交换功能的方法:

a = a + b;

b = a - b; // 此时的a已经不是原来的a 了,此时 a = a + b;

a = a - b; //此时的a和b都不是原来的a和b了,此时的 a 是原来两个变量的和,此时的 b 是原来的变量a 的值。

这种方法就没有定义新的变量就完成了交换功能,可是问题也有,如果a与b  的和超出int类型的最大值呢?就会有精度的损失。

那么就没有又不用定义中间变量,又不用担心会损失精度的方法了吗?

有滴!这是第三种方法,这种方法比较有技巧性(本方法采用的是位运算中的技巧:a = a ^ b ^ b,也就是一个数连续与另一个数进行两次与运算结果还是这个数本身):

a =  a ^ b;

b =  a ^ b;//此时的a已经不是原来的a了,此时右边的表达式就等价于:( a ^ b ) ^ b ,结果是a,并把它赋予变量b;

a =  a ^ b;//此时的a与b都不是原来的a与b了,此时右边的表达式就等价于:a ^ ( a ^ b ) ,结果是b,并把它赋予变量a;

这种方法技巧性比较强,而且运算速度比较快,节省内存,但是一般不好想,所以一般在程序编程中我们还是用第一种方法的时候最多。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值