For two numbers, for the result, the remaining bit1 are different or differentiated.
The following solution is very concise:
int lastBitOf1(intNumber ) { returnNumber & ~ (number-1);} voidGettwounique (vector<int>::iterator Begin, vector<int>::iterator End, vector<int>&unique) { intXorresult =0; for(vector<int>::iterator iter = begin; Iter! = END; ++iter) Xorresult^= *ITER; intdiff =lastBitOf1 (Xorresult); intFirst =0; intSecond =0; for(vector<int>::iterator iter = begin; Iter! = END; ++ITER) { if(diff & *iter) first^= *ITER; ElseSecond^= *ITER; } unique.push_back (first); Unique.push_back (second);}
For cases with three numbers, it's a bit more complicated:
To use a different or result with all the different or the last one, then different or. As follows:
http://blog.csdn.net/sunmenggmail/article/details/8035008
- for (iter = Numbers.begin (); ITER! = Numbers.end (); ++iter)
- Flags ^= lastBitOf1 (xorresult ^ *iter);
- Flags = LASTBITOF1 (flags);
Two numbers (three numbers) that occur once in an array & ask the last bit to be 1