Java中^详解以及异或交换整型变量
首先声明!上一遍文章有很多漏洞,主要是第一次写,打错了不少东西。比如说在int取值范围的表格中最小取值十进制没有加负号。下次注意。
今天我想讲一下^符号。还是因为我们学校是大专的原因(我估计😄)所以并没有详细讲解 ^ 但经过我自己的学习现在对 ^ 也有了一些理解。不敢说非常非常好。但我觉得我想把我所理解的详细的分享出来。希望对大家有所帮助。
首先我们先知道异或是什么意思。首先我们先来看一下与或非
a | b | 与 & | 或 | | 非 ~ |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 1 | 0 | 1 |
那么异或是
a | b | 异或^ |
---|---|---|
1 | 1 | 0 |
0 | 1 | 1 |
0 | 0 | 0 |
可以看出异或无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
完成交换!
好了就写到这里吧,希望对大家有帮助!