1、0 ^ n == n, n ^ n==0
2、異或運算滿**換律和結合律
題目1:如何不使用額外變數交換兩個數
int a == 甲; int b = 乙;
a = a ^ b;
b = a ^ b;
a = a ^ b;
把上面**分為三個步驟
第一步:
a = a ^ b; 此步驟過後 a = 甲 ^乙;b = 乙;
第二步:
b = a ^ b; 此步驟過後 a = a ^ b = 甲 ^ 乙;b = a ^ b = 甲 ^ 乙 ^ 乙 = 甲;
第三步:
a = a ^ b; 此步驟過後b = 甲; a = a ^ b = 甲 ^ 乙 ^ 甲 = 乙;
完成交換
注意:兩個交換的數不能指向相同記憶體!!!
題目2:乙個陣列中有一種數出現了奇數次, 其他數都出現了偶數次,怎麼找到並列印這種數
方法:遍歷陣列所有元素,一直異或。因為兩個相同的數異或為0,所以異或到最後的數就是出現奇數次的數。
public
static
void
printoddnumber1
(int
arr)
system.out.
println
(eor)
}
題目3:怎麼把乙個int整型數,二進位制位最右側的1提取出來
例如:輸入1001……01000 輸出0000……01000
方法:加入輸入的為n,這輸出為 n & (~n + 1)
步驟:輸入:1001……01000
取反:0110……10111
再加一:0110……11000
相與:0000……01000
題目4:乙個陣列中有兩種數出現了奇數次, 其他數都出現了偶數次,怎麼找到並列印這兩種數
思路:1、按照題目2的方法,全部的數一起異或,得到eor = a ^ b
2、按照題目3的方法,提取eor最右邊1(其實任意乙個一都行,因為值為1的地方表示兩個數在該位不同),根據這個位是否為1,將陣列分為a、b兩部分。
3、對a部分的數進行一起進行異或運算,得到數1,將數1與eor異或得到數2
public
static
void
printoddnumber
(int
arr)
int rightone = eor &
(~eor +1)
;int numa =0;
for(
int i =
0; i < arr.length; i++)}
numb = eor ^ numa;
}
題目5:獲得乙個數二進位制位,為1的個數public
static
intbitcount
(int n)
return count;
}
異或相關的雜題
連續多場 cf 都卡在 xor 題,並且以各不相同的方式寄了。不得不惡補一下這方面的處理技巧 codeforces 訪問有點慢,所以掛洛谷的題目鏈結 e 和 s 在玩博弈遊戲,e 先手 s 後手。給一棵 n 個節點的樹,節點的值包含 1,n 中的每乙個值。e 先隨便選擇乙個點,占領它 點 u s 只...
基礎演算法 與 或 異或運算
參加運算的兩個資料,按二進位制位進行 與 運算。運算規則 0 0 0 0 1 0 1 0 0 1 1 1 即 兩位同時為 1 結果才為 1 否則為0 例如 3 5 即 0000 0011 0000 0101 0000 0001 因此,3 5的值得1。例如 9 5 即 0000 1001 9的二進位制...
異或運用 演算法題 缺失的數
題目 給出乙個包含 0 n 中 n 個數的序列,找出0 n 中沒有出現在序列中的那個數。public int findmissing int nums int result total 0 int result incomplete 0 for int i 0 i nums.length i for...