网站开发设计报告怎么写,企业网址一般怎么设置,如何为网站建设内容,龙岩电商公司前提#xff1a;
异或操作符合交换律#xff0c;结合律#xff08;因为其根本上来抽象理解#xff0c;就是查看所有项二进制数相同位是否有奇数个1#xff0c;对运算结果二进制数而言#xff0c;没有该位为0#xff0c;有该位为1#xff0c;与顺序无关#xff09;。 …前提
异或操作符合交换律结合律因为其根本上来抽象理解就是查看所有项二进制数相同位是否有奇数个1对运算结果二进制数而言没有该位为0有该位为1与顺序无关。
任何数与零进行异或结果仍是他自己
两个相同的数进行异或操作结果为零自反性 如下实现数值交换代码
public void swap(int[]arr,int x,int y){//用异或运算做交换arr[x]arr[x]^arr[y];arr[y]arr[x]^arr[y];arr[x]arr[x]^arr[y];}
该操作不需要再开辟另一块内存空间去进行数值交换
但是注意交换数值双方指向内存必须是两块独立的内存相同值没问题相同内存不行
如上如果x,y指向同一块内存第一次异或使arr[x]指向内存存储的数变为0与此同时由于arr[y]与arr[x]指向同一块内存arr[y]也变为0,那么后面两次异或没有意义原先存储的数丢失了。 问题解决实例在一堆数中只有一个数出现了奇数次查出这个数
对所有数进行异或运算那么最后的结果将是该出现奇数次的数
public int getTheOneNumber(int[] arr){int number0;for (int i : arr) {number number^i;}return number;}
那如果是一堆数中有两个数出现了奇数次其他都出现了偶数次如何找出这两个数
这是我们如果依然对这一堆书进行异或运算那我们将得到这两个数异或的结果
为了方便我们把这两个数称为x,y, 我们现在得到eorx^y
x,y一定不相同那么eor值不为0
所以x,y的二进制数一定存在一位或多位一个为1一个为0的情况
那么我们接下来取出eor最右侧的1假设该位是第i位(取数方法eor取反加一在于eor做与运算)所有数与该数做与运算将所有数分为i位上为1的数和i位上为零的数x,y因此被分开分开后另使同为10的数异或得到x(y)
x(y)与eor异或得到y(x) public int[] getTwoNumber(int[] arr){int eor0;for (int i : arr) {eor^i;}int number (~eor1)eor;int eor20;for (int i : arr) {if((numberi)!0){eor2^i;}}eor eor2^eor;int[] goal {eor,eor2};return goal;}