Java中异或详解以及异或交换整型变量

Java中^详解以及异或交换整型变量

首先声明!上一遍文章有很多漏洞,主要是第一次写,打错了不少东西。比如说在int取值范围的表格中最小取值十进制没有加负号。下次注意。

今天我想讲一下^符号。还是因为我们学校是大专的原因(我估计😄)所以并没有详细讲解 ^ 但经过我自己的学习现在对 ^ 也有了一些理解。不敢说非常非常好。但我觉得我想把我所理解的详细的分享出来。希望对大家有所帮助。

首先我们先知道异或是什么意思。首先我们先来看一下与或非

ab与 &或 |非 ~
11110
01011
00101

那么异或是

ab异或^
110
011
000

可以看出异或无a b相同都为0不同返为1

这道了上面这些我们来看看 ^ 是工作的
定义两个变量a和b
int a , b;(32位)
若;
a = 1 二进制;(0000 0000 0000 0000 0000 0000 0000 0001)
b = 1 二进制;(0000 0000 0000 0000 0000 0000 0000 0001)
a^b = 0 二进制;(32位都相等所以为;
0000 0000 0000 0000 0000 0000 0000 0000)

若;
a = 0 二进制;(0000 0000 0000 0000 0000 0000 0000 0000)
b = 1 二进制;(0000 0000 0000 0000 0000 0000 0000 0001)
a^b = 1 (31位都相等所以为0,但最后一位不等所以位1;
0000 0000 0000 0000 0000 0000 0000 0001)

若;
a = 0 二进制;(0000 0000 0000 0000 0000 0000 0000 0000)
b = 0 二进制;(0000 0000 0000 0000 0000 0000 0000 0000)
a^b = 0 (32位都相等所以为;
0000 0000 0000 0000 0000 0000 0000 0000)
以上就是 ^ 的理论部分了👆👆👆

下面就是讲一讲如何使用 ^ 来实现整数交换了
首先先来个简单的;
0和一的交换
废话不多说直接上程序😄😄😄

int a = 0;
int b = 1;
System.out.println("a最初的值;"+a+" b最初的值;"+b);
a = a^b;
b = a^b;
a = a^b;
System.out.println("a现在的值;"+a+" b现在的值;"+b);
/*
输出结果;
a最初的值;0 b最初的值;1
a现在的值;1 b现在的值;0
*/

我们一行一行分析
a = a^b;
b = a^b;
a = a^b;

首先第一行a = a^b;
a = 0000 0000 0000 0000 0000 0000 0000 0000(二进制32位)
b = 0000 0000 0000 0000 0000 0000 0000 0001(二进制32位)
a^b = 0000 0000 0000 0000 0000 0000 0000 0001(二进制32位)
a = a^b = 1;

第二行a = a^b;
a = 0000 0000 0000 0000 0000 0000 0000 0001(二进制32位)
b = 0000 0000 0000 0000 0000 0000 0000 0001(二进制32位)
b = a^b = 0000 0000 0000 0000 0000 0000 0000 0000(二进制32位)
b = a^b = 0;

第三行a = a^b;
a = 0000 0000 0000 0000 0000 0000 0000 0000(二进制32位)
b = 0000 0000 0000 0000 0000 0000 0000 0001(二进制32位)
a^b = 0000 0000 0000 0000 0000 0000 0000 0001(二进制32位)
a = a^b = 1;

a=1
b=0
此时两个数据就被交换了!

可能有聪明的小伙伴就问了,为什么最后还要有一个a = a^b?明明第二行已经完成了交换呀!
我们再来看一个别的例子

int a = -32;
int b = 52;
System.out.println("a最初的值;"+a+" b最初的值;"+b);
a = a^b;
b = a^b;
a = a^b;
System.out.println("a现在的值;"+a+" b现在的值;"+b);
/*
a最初的值;-32 b最初的值;52
a现在的值;52 b现在的值;-32
*/

我们再来一行一行分析
a = a^b;
b = a^b;
a = a^b;
首先第一行a = a^b;
a = 1000 0000 0000 0000 0000 0000 0010 0000(二进制32位)
b = 0000 0000 0000 0000 0000 0000 0011 0100(二进制32位)
a^b = 1000 0000 0000 0000 0000 0000 0001 0100(二进制32位)
a = a^b = -20;
问题出现了!但是第三行会解决这个问题!

第二行a = a^b;
a = 1000 0000 0000 0000 0000 0000 0001 0100(二进制32位)
b = 0000 0000 0000 0000 0000 0000 0011 0100(二进制32位)
a^b = 1000 0000 0000 0000 0000 0000 0010 0000(二进制32位)
b = a^b = -32;

第三行a = a^b;
a = 1000 0000 0000 0000 0000 0000 0001 0100(二进制32位)
b = 1000 0000 0000 0000 0000 0000 0010 0000(二进制32位)
a^b = 1000 0000 0000 0000 0000 0000 0011 0100(二进制32位)
a = a^b = 52;
a=52
b=-32
完成交换!

好了就写到这里吧,希望对大家有帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值