異或以及一些小技巧

2021-10-10 04:22:58 字數 1395 閱讀 1836

n = n ^ 0 0 = n ^ n

n >> 2 = n / 2 n << 2 = n * 2

說明》與》的區別

'>> 不帶符號位右移,即該數若為正數,則高位補0,若該數為負數,則高位補1

『>>> 帶符號位右移,即不管該數為正數還是負數,高位都不0

1000 >> 1 = 1100

0100 >> 1 = 0010

1000 >>> 1 = 0100

0100 >>> 1 = 0010

將某乙個數 乘2加1: n = n * 2 + 1 相當於 n = n << 1 & 1

異或操作滿足結合律與交換律:

​ a ^ b = b ^ a

​ a ^ b ^ c = a ^ (b ^ c)

總之若干個數進行異或操作,其結果與異或的順序無關。

取某個數二進位制表示,最右邊為1的位置上為1,其餘位置都補0表示的數:

x = (~n + 1) & n

例: n=11000110, 結果 00000010

​ ~n = 00111001

​ ~n+1=00111010

(~n + 1) & n = 00000010

已知乙個陣列,其中有乙個數是奇數個,其餘的數全是偶數個,求奇數個的數?

public

static

void

main

(string[

] args)

;int res =0;

for(

int j : arr)

system.out.

println

(res)

;}

已知乙個陣列,其中有2個數是奇數個,其餘的數全是偶數個,求這兩個奇數個的數?

public

static

void

main

(string[

] args)

;int n =0;

for(

int j : arr)

// n = 3 ^ 4

int rightone =

(~n +1)

& n;

//關鍵點1 將n轉化為二進位制,求最右邊位置為1,其餘用0填充的數 此處n=7 (111)

//rightone=1 (001)

int one =0;

for(

int j : arr)

}int two = n ^ one;

system.out.

println

(one)

; system.out.

println

(two)

;}

異或以及其相關應用

先舉乙個運用到異或的題目來深刻理解一下異或的內涵和在何種情況下應用其會使問題處理簡便 1 1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現 一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來 不用輔助儲存空 間,能否設計乙個演算法實現?解法 一 顯然已經有人提出...

一些小技巧

關注 乙個好的程式設計師不應該把所有的判斷交給編譯器和偵錯程式,應該在程式中自己加以程式保護和錯誤定位,具體措施包括 對於所有有返回值的函式,都應該檢查返回值,除非你確信這個函式呼叫絕對不會出錯,或者不關心它是否出錯。一些函式返回錯誤,需要用其他函式獲得錯誤的具體資訊。例如accept返回inval...

一些小技巧

protected void repparent itemdatabound object sender,system.web.ui.webcontrols.repeateritemeventargs e 在父datalist的itemdatabound事件裡面寫子datalist的資料來源 繫結 ...