实现代码:
int GetIdxOfFirst1AtData(int curData)
{
int curIdx = 0;
const int maxIdx = 32;
while (curIdx != maxIdx)
{
if (0 == curData & 0x01) return curIdx;
++curIdx;
curData >> 1;
}
return -1;
}
bool Is1InCertainIdxAtData(int curData, int pos)
{
curData >> pos;
return (0 == curData & 0x01);
}
void GetTwoNumAppearOnce(int* pData, int size, int& num1, int& num2)
{
if (nullptr == pData || size < 2) return;
int resultOfXOR = 0;
for (int idx = 0; idx < size; ++idx) resultOfXOR ^= pData[idx];
int destIdx = GetIdxOfFirst1AtData(resultOfXOR);
for (int idx = 0; idx < size; ++idx)
{
int curData = pData[idx];
if (Is1InCertainIdxAtData(curData, destIdx)) num1 ^= curData;
else num2 ^= curData;
}
}