移位操作
右移--补符号位
左移--全部补0
右移一位相当于除以二并取整
左移以为相当于乘以二
端存储
http://blog.csdn.net/favory/article/details/4441361
101个数,50个出现了2次,1个出现了1次,求出此数。
1 /*103个数字,50个出现了2次,3个出现了1次,求这三个数*/ 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 #define isON(n, i) ((n) & 1 << (i)) 6 7 void findTheSingleNumber(int *arr,int size); 8 int main(int argc,char* argv[]) 9 { 10 int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,111,1,2,3,4,555,5,6,7,8,9,10,333,11,12,13}; 11 int k = sizeof(a)/sizeof(int); 12 findTheSingleNumber(a,k); 13 return 0; 14 } 15 16 void getnum(int a[],int length); 17 void findTheSingleNumber(int *arr,int size) 18 { 19 int tempA = 0; 20 int tempB = 0; 21 int countA = 0; 22 int countB = 0; 23 int b[size+1]; 24 int i=0; 25 int j=0; 26 int k=0; 27 28 for(i=0;i<32;i++) //int 只有32位 29 { 30 for(j=0;j<size;j++) 31 { 32 if(isON(arr[j],i)) //检验arr[j] 的第i位是否为1; 33 { 34 tempA ^= arr[j]; 35 countA++; 36 } 37 else { 38 tempB ^= arr[j]; 39 countB++; 40 } 41 } 42 if(countA%2==1) 43 { 44 if(tempB==0) //三个都在countA中 45 continue; //换int类型整数的另一位继续分2组求解 46 else { //countA中只有一个 tempA即为所求 47 for(i=0;i<size;i++) 48 { 49 b[k++] = arr[i]; 50 } 51 b[k] = tempA; 52 getnum(b,k+1); 53 printf("%d ",tempA); 54 break; 55 } 56 } 57 else { 58 if(tempA==0) //三个都在countB中 59 continue; 60 else { 61 for(i=0;i<size;i++) 62 { 63 b[k++] = arr[i]; 64 } 65 b[k] = tempB; 66 getnum(b,k+1); 67 printf("%d ",tempB); //countB中只有一个 tempB即为所求 68 break; 69 } 70 } 71 } 72 } 73 74 void getnum(int a[],int length) 75 { 76 int s = 0; 77 int i; 78 for(i=0;i<length;i++) 79 { 80 s = s^a[i]; 81 } 82 int temp1 = s; 83 int temp2 = s; 84 int k=0; 85 while((temp1&1)==0) 86 { 87 temp1 = temp1>>1; 88 k++; 89 } 90 for(i=0;i<length;i++) 91 { 92 if((a[i] >> k)&1) 93 { 94 s = s^a[i]; 95 } 96 } 97 printf("%d %d ",s,s^temp2); 98 }