#include <stdio.h>
#include <stdlib.h>
/* This finction sets the values of *x and *y to nonr-epeating
elements in an array arr[] of size n*/
void get2NonRepeatingNos(int arr[], int n, int *x, int *y)
{
int xor = arr[0]; /* Will hold xor of all elements */
int set_bit_no; /* Will have only single set bit of xor */
int i;
*x = 0;
*y = 0;
/* Get the xor of all elements */
for(i = 1; i < n; i++)
xor ^= arr[i];
/* Get the rightmost set bit in set_bit_no */
set_bit_no = xor & ~(xor-1);
//printf("set_bit_no %d\n", set_bit_no);
/* Now divide elements in two sets by comparing rightmost set
bit of xor with bit at same position in each element. */
for(i = 0; i < n; i++)
{
if(arr[i] & set_bit_no){
*x = *x ^ arr[i]; /*XOR of first set */
//printf("*x and arr and arr[i] & set_bit_no = %d %d %d \n",*x, arr[i],arr[i] & set_bit_no);
}
else{
*y = *y ^ arr[i]; /*XOR of second set*/
//printf("*y and arr= %d %d\n",*y, arr[i]);
}
}
}
/* Driver program to test above function */
int main()
{
int arr[] = {2, 3, 7, 9, 11, 2, 3, 11};
int *x
= (int *)malloc(sizeof(int)); int *y
= (int *)malloc(sizeof(int)); get2NonRepeatingNos(arr, 8, x, y);
printf("The non-repeating elements are %d and %d", *x
, *y
); }
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KIAovKiBUaGlzIGZpbmN0aW9uIHNldHMgdGhlIHZhbHVlcyBvZiAqeCBhbmQgKnkgdG8gbm9uci1lcGVhdGluZwogZWxlbWVudHMgaW4gYW4gYXJyYXkgYXJyW10gb2Ygc2l6ZSBuKi8Kdm9pZCBnZXQyTm9uUmVwZWF0aW5nTm9zKGludCBhcnJbXSwgaW50IG4sIGludCAqeCwgaW50ICp5KQp7CiAgaW50IHhvciA9IGFyclswXTsgLyogV2lsbCBob2xkIHhvciBvZiBhbGwgZWxlbWVudHMgKi8KICBpbnQgc2V0X2JpdF9ubzsgIC8qIFdpbGwgaGF2ZSBvbmx5IHNpbmdsZSBzZXQgYml0IG9mIHhvciAqLwogIGludCBpOwogICp4ID0gMDsKICAqeSA9IDA7CiAKICAvKiBHZXQgdGhlIHhvciBvZiBhbGwgZWxlbWVudHMgKi8KICBmb3IoaSA9IDE7IGkgPCBuOyBpKyspCiAgIHhvciBePSBhcnJbaV07CiAKICAvKiBHZXQgdGhlIHJpZ2h0bW9zdCBzZXQgYml0IGluIHNldF9iaXRfbm8gKi8KICBzZXRfYml0X25vID0geG9yICYgfih4b3ItMSk7CiAgLy9wcmludGYoInNldF9iaXRfbm8gJWRcbiIsIHNldF9iaXRfbm8pOwogIC8qIE5vdyBkaXZpZGUgZWxlbWVudHMgaW4gdHdvIHNldHMgYnkgY29tcGFyaW5nIHJpZ2h0bW9zdCBzZXQKICAgYml0IG9mIHhvciB3aXRoIGJpdCBhdCBzYW1lIHBvc2l0aW9uIGluIGVhY2ggZWxlbWVudC4gKi8KICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspCiAgewogICAgaWYoYXJyW2ldICYgc2V0X2JpdF9ubyl7CiAgICAgKnggPSAqeCBeIGFycltpXTsgLypYT1Igb2YgZmlyc3Qgc2V0ICovCiAgICAgIC8vcHJpbnRmKCIqeCBhbmQgYXJyIGFuZCBhcnJbaV0gJiBzZXRfYml0X25vID0gJWQgJWQgJWQgXG4iLCp4LCBhcnJbaV0sYXJyW2ldICYgc2V0X2JpdF9ubyk7CiAgICB9CiAgICBlbHNlewogICAgICp5ID0gKnkgXiBhcnJbaV07IC8qWE9SIG9mIHNlY29uZCBzZXQqLwogICAgIC8vcHJpbnRmKCIqeSBhbmQgYXJyPSAlZCAlZFxuIiwqeSwgYXJyW2ldKTsKICAgIH0KICB9Cn0KIAovKiBEcml2ZXIgcHJvZ3JhbSB0byB0ZXN0IGFib3ZlIGZ1bmN0aW9uICovCmludCBtYWluKCkKewogIGludCBhcnJbXSA9IHsyLCAzLCA3LCA5LCAxMSwgMiwgMywgMTF9OwogIGludCAqeCA9IChpbnQgKiltYWxsb2Moc2l6ZW9mKGludCkpOwogIGludCAqeSA9IChpbnQgKiltYWxsb2Moc2l6ZW9mKGludCkpOwogIGdldDJOb25SZXBlYXRpbmdOb3MoYXJyLCA4LCB4LCB5KTsKICBwcmludGYoIlRoZSBub24tcmVwZWF0aW5nIGVsZW1lbnRzIGFyZSAlZCBhbmQgJWQiLCAqeCwgKnkpOwogIGdldGNoYXIoKTsKfQ==