1 import java.util.Arrays; 2 3 public class Split { 4 5 public static void main(String[] args) 6 7 { 8 9 int data[]={2,4,3,5,6,5,2,6}; 10 int[] num1 = new int[data.length]; 11 int[] num2= new int[data.length]; 12 FindApperanceOnce(data,num1,num2); 13 /*System.out.println(Arrays.toString(num1)); 14 System.out.println(Arrays.toString(num2));*/ 15 /*find(num1); 16 find(num2);*/ 17 18 } 19 20 21 public static void FindApperanceOnce(int data[],int [] num1,int [] num2) 22 { 23 if(data ==null || data.length<2) 24 return; 25 int result = 0; //^ 26 for(int i =0;i<data.length;i++) 27 { 28 result ^=data[i];//异或结果肯定不为0,因为有两个不相同的数字 29 } 30 int indexOf1 = FindFirstBitIs1(result);//找到第一个为1的位 31 System.out.println(result+"**"+indexOf1+"**"); 32 for(int j=0;j<data.length;j++) 33 { 34 if(IsBit1(data[j],indexOf1)==1) 35 { 36 num1 [j]^=data[j]; //将原数组根据第indexOf1位是不是1分为两个子数组 37 } 38 else 39 num2[j] ^= data[j]; 40 } 41 find(num1); 42 find(num2); 43 44 45 } 46 47 private static int IsBit1(int num, int indexBit) { 48 // TODO Auto-generated method stub 49 num = num>>indexBit; 50 51 return (num & 1); 52 } 53 54 //找出数字num的二进制位中,第一个为1的位数。 55 private static int FindFirstBitIs1(int num) { 56 // TODO Auto-generated method stub 57 int indexBit = 0; 58 while((num&1)==0) 59 { 60 num>>=1; 61 ++indexBit; 62 } 63 return indexBit; 64 } 65 //从数组中找到唯一一个只出现一次的数字 66 private static void find(int[] data) 67 { 68 int result =0; 69 for(int i=0;i<data.length;i++) 70 { 71 result^=data[i]; 72 } 73 System.out.println(result); 74 } 75 }