乙個陣列中有兩種數出現了奇數次, 其他數都出現了偶數次, 怎麼找到這兩個數。
因為可能有很多的數,所以不能開陣列,就使用到了異或的運算,我還沒有很懂就直接看**吧。
//乙個陣列中有兩種數出現了奇數次,
//其他數都出現了偶數次, 怎麼找到這兩個數
#include using namespace std;
int main()
; int n = sizeof(x) / sizeof(*x);
//1.第一次異或,求得a ^ b
int ab = 0;
for(int i = 0;i < n;i++)
ab ^= x[i];
// cout << ab << endl;
//2.第二次異或
//1)首先找到a ^ b 的最右邊的1,保留1開始的二進位制位
//10110010 保留t = 10 11000 00111 + 1 = 01000
int t = ab & (~ab + 1);
// cout << t << endl; //10
//2)異或的時候,只要這個數與t按位與為0,異或起來就得到了
//a和b中的其中1個數a
int a = 0;
for(int i = 0;i < n;i++)
} //3.第三次異或,b = a ^ b ^ a
int b = ab ^ a;
cout << a << " " << b << endl;
return 0;
}
異或運算 有趣的異或運算
異或運算可以看做是沒有進製的加法,按位異或運算,相同為0,不同為1。0 0 0 0 1 1 1 0 1 1 1 0 觀察運算結果我們發現,當與0做異或運算時,另一元值不變 而與1做異或運算時,另一元值值取反。根據以上異或運算的特徵,可以有以下用途,除方便直觀外,運算效能也更加優異。1 變數重置0 假...
(與運算) (或運算) (異或運算)
即 兩個運算元同為 1 的時候為1 0 0 0 1 0 1 0 1 1 1 1 1 即 兩個運算元中至少有乙個為 1 的時候為1 0 0 0 0 1 1 1 0 1 1 1 0 即 兩個運算元不同的時候為1 運算規則 1 0 0 1 即 對乙個二進位制數按位取反,即將0變1,1變0。將乙個運算物件的...
與運算( ) 或運算( ) 異或運算( )
預算規則 0 0 0 0 1 0 1 0 0 1 1 1 即 兩個同時為1,結果為1,否則為0 例如 3 5 十進位制3轉為二進位制的3 0000 0011 十進位制5轉為二進位制的5 0000 0101 結果 0000 0001 轉為十進位制 1 即 3 5 1 運算規則 0 0 0 0 1 1 ...