|
发表于 2022-11-11 11:37:54
|
显示全部楼层
本帖最后由 jackz007 于 2022-11-11 13:50 编辑
- a ^ b 两个数对应二进制位做异或,如果对应位相等得 0,不相等得 1,例如:
- 171 ^ 229 = 0xab ^ 0xe5 = 0x4e = 78
- 1 0 1 0 1 0 1 1 0xab = 171
- 1 1 1 0 0 1 0 1 0xe5 = 229
- ----------------
- 0 1 0 0 1 1 1 0 0x4e = 78
复制代码
两个相同的数作异或,得到的值一定是 0,二进制位的异或是有累积效应的
所以,55 ^ 127 ^ 8 ^ 55 ^ 127 = 8
对于
- int[] a = {1,8,2,3,5,3,2,8,1} ;
- int ret = a[0];
- for(int i=1;i<a.length;i++){
- ret ^= a[i];
- }
复制代码
就是 a 的 8 个元素连续做异或:ret = a[0] ^ a[1] ^ a[2] ^ a[3] ^ a[4] ^ a[5] ^ a[6] ^ a[7] ^ a[8]
- 0 0 0 0 0 0 0 1 1 a[0]
- 0 0 0 0 1 0 0 0 8 a[1]
- ----------------
- 0 0 0 0 1 0 0 1 9 ret
- 0 0 0 0 0 0 1 0 2 a[2]
- ----------------
- 0 0 0 0 1 0 1 1 11 ret
- 0 0 0 0 0 0 1 1 3 a[3]
- ----------------
- 0 0 0 0 1 0 0 0 8 ret
- 0 0 0 0 0 1 0 1 5 a[4]
- ----------------
- 0 0 0 0 1 1 0 1 13 ret
- 0 0 0 0 0 0 1 1 3 a[5]
- ----------------
- 0 0 0 0 1 1 1 0 14 ret
- 0 0 0 0 0 0 1 0 2 a[6]
- ----------------
- 0 0 0 0 1 1 0 0 12 ret
- 0 0 0 0 1 0 0 0 8 a[7]
- ----------------
- 0 0 0 0 0 1 0 0 4 ret
- 0 0 0 0 0 0 0 1 1 a[8]
- ----------------
- 0 0 0 0 0 1 0 1 5 ret
复制代码
最后结果 ret = 5 ,说明 a 的 9 个元素中,只有 5 是单次出现的。 |
|