與異或操作相關的簡單演算法題

2021-10-24 22:11:29 字數 1519 閱讀 5819

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