A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨增坤 于 2013-11-1 12:02 编辑

为啥一个数异或一个数之后再异或一遍这个数 结果还是本身??为啥呀????

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

8 个回复

倒序浏览
异或就是用二进制来运算的 相同为0,不同为1。 一个数异或自己本身结果为零(全部二进制位相同) 一个数异或零结果为这个数本身(0和0异或为0,1和0异或为1,所以结果还是原来的数)  而你说的一个数异或另一个数两次就是相当于一个数异或零 所以结果还是这个数本身

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 说的精辟

查看全部评分

回复 使用道具 举报
本帖最后由 ヅ飞飞 于 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了,感觉玩玩而已,开发不一定会用到。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
丑陋了,沙发精辟:两个相同数异或等于零。
回复 使用道具 举报
本帖最后由 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里面对于异或运算的内部运算机制。


评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
楼主好好体会
如果问题已经解决,请修改修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
异或这个知识点,有一个重要的用途就是用于加密{:soso_e105:}!!……ps来晚了,也给我点分吧
回复 使用道具 举报
bolt 中级黑马 2016-2-4 09:31:52
8#
楼上说得好像不够严密啊。

我觉得这个问题可以穷举 从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:12
9#
原来是版主的帖子啊6666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马