黑马程序员技术交流社区
标题:
为什么一个数异或一个数再异或一个数还是这个数
[打印本页]
作者:
jing迪
时间:
2013-11-1 10:22
标题:
为什么一个数异或一个数再异或一个数还是这个数
本帖最后由 杨增坤 于 2013-11-1 12:02 编辑
为啥一个数异或一个数之后再异或一遍这个数 结果还是本身??为啥呀????
作者:
ixiangfeng
时间:
2013-11-1 10:40
异或就是用二进制来运算的 相同为0,不同为1。 一个数异或自己本身结果为零(全部二进制位相同) 一个数异或零结果为这个数本身(0和0异或为0,1和0异或为1,所以结果还是原来的数) 而你说的一个数异或另一个数两次就是相当于一个数异或零 所以结果还是这个数本身
作者:
ヅ飞飞
时间:
2013-11-1 10:47
本帖最后由 ヅ飞飞 于 2013-11-1 10:51 编辑
算一下看看规律就知道了:
byte b = 9;
byte b0 = 3;
System.out.println(b^b0^b0); // ?
9的二进制:00001001
3的二进制:00000011
00001001(9)
^00000011(3)
=00001010(按位运算相同为0,不同为1)
^00000011(3)
=00001001(貌似还是9)
这其实就是二进制的规律:一个二进制数异或同一个数两次则结果还是自己。
这个特性总感觉像对称密钥加密(毕老师也提到了),第一个二进制数是数据第二个二进制数是密钥,当要发送数据时异或一下密钥(数据值改变:加密),当接受者拿到加密数据后在异或一次(数据恢复原值:解密)。当然真正的加密算法不仅仅如此,但目测加密算法会用到这个特性。
只要记得二进制有这个特性就OK了,感觉玩玩而已,开发不一定会用到。
作者:
ヅ飞飞
时间:
2013-11-1 10:50
丑陋了,沙发精辟:两个相同数异或等于零。
作者:
X11
时间:
2013-11-1 10:53
本帖最后由 X11 于 2013-11-1 10:54 编辑
Java的异或运算还有一个前提那就是它都是以二进制数据为基础进行的运算。也就是说当我们在使用代码中使用到异或运算时,它都会先将两个条件进行转换,转换成二进制数据后,再进行运算。异或(^)运算规则:两个操作数的位中,相同则结果为0,不同则结果为1。即1^1=0;1^0=1; 0^1=1; 0^0=0;
例如:
int a = 4^6 即:100^110 = 010 (a=2);如果在运算a=a^6 , 010^110 = 100 (a=4)
这就是Java里面对于异或运算的内部运算机制。
作者:
黄炳期
时间:
2013-11-1 10:57
楼主好好体会
如果问题已经解决,请修改修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
作者:
张秀威
时间:
2013-11-1 11:14
异或这个知识点,有一个重要的用途就是用于加密{:soso_e105:}!!……ps来晚了,也给我点分吧
作者:
bolt
时间:
2016-2-4 09:31
楼上说得好像不够严密啊。
我觉得这个问题可以穷举 从4个可能性进行证明。
被异或数是1或0 和异或数是1或0的情况:
1^0^0 =1
0^1^1 =0
1^1^1=1
0^0^0=0
作者:
bolt
时间:
2016-2-4 09:33
原来是版主的帖子啊6666
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2