谁给讲下下下面的算法是怎么个原理 没看懂( Java 异或)

2017-11-16 17:57:15 +08:00
 wumingxiaoQ
java 的位运算符中有一个叫异或的运算符,用符号(^)表示,其运算规则是:两个操作数的位中,相同则结果为 0,不同则结果为 1。下面看一个例子:
public class TestXOR{
public static void main(String[] args)
{
int i = 15, j = 2;
System.out.println("i ^ j = " + (i ^ j));
}
}
运行结果是:i ^ j = 13.
分析上面程序,i=15 转成二进制是 1111,j=2 转成二进制是 0010,根据异或的运算规则得到的是 1101,转成十进制就是 13.
利用这个规则我们可以灵活运用到某些算法。比如,假定有 2K+1 个数,其中有 2k 个相同,需要找出不相同的那个数,比如:2、3、4、4、3、5、6、6、5。我们利用异或运算符就可以这样写:
public class TestXOR{
public static void main(String[] args)
{
int[] array = {2,3,4,4,3,5,6,6,5};
int v = 0;
for (int i = 0;i < array.length;i++) {
v ^= array[i];
}
System.out.println("只出现一次的数是:" + v);
}
}
结果是:只出现一次的数是 2.
我们就是巧用异或运算符的规则,得出一个数和 0 异或还是自己,一个数和自己异或是 0 的原理。


原文地址: http://blog.csdn.net/renjie_998003/article/details/50738025


不理解 for 循环出来的为什么是只出现一次的数字
1979 次点击
所在节点    Java
5 条回复
crab
2017-11-16 18:25:41 +08:00
v 都被重新赋值了,怎么可能。
hustlike
2017-11-16 20:07:00 +08:00
因为相等的两个数字 异或的结果是 0 . 0 异或 任何数 x = x

a a b b c c d => a ^ a ^ b ^ b ^ c ^ c ^ d => 0 ^ d => d
neosfung
2017-11-16 21:37:34 +08:00
#2 正解
ffkjjj
2017-11-24 22:23:48 +08:00
@neosfung 要是相同的元素有奇数个呢…… a^a^a^b^b^b
artyama
2017-11-28 10:05:41 +08:00
这个算法告诉我们,“解铃还须系铃人”。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/407000

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX