使用異或運算的小難題

2021-09-27 08:41:07 字數 812 閱讀 9577

乙個陣列中有兩種數出現了奇數次, 其他數都出現了偶數次, 怎麼找到這兩個數。

因為可能有很多的數,所以不能開陣列,就使用到了異或的運算,我還沒有很懂就直接看**吧。

//乙個陣列中有兩種數出現了奇數次, 

//其他數都出現了偶數次, 怎麼找到這兩個數

#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 ...