位運算的妙用

2021-09-17 21:12:02 字數 1006 閱讀 8984

位運算的操作:

負數是按照補碼的形式參與按位與運算的

原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值.(1為正,0為負)

反碼的表示方法是:

正數的反碼是其本身

負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.

補碼的表示方法是:

正數的補碼就是其本身

負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)

為什麼會有反碼和補碼呢?是為了讓符號位也能參與運算,我們就不需要判斷符號位了

為了解決0和-0問題,出現了補碼,機器中的計算是使用補碼計算的

1.進行清零計算(將乙個單元與0進行位與運算結果為零)

2.獲取乙個數中指定的位(例如取x=1010 1101的低四位 則將x&00001111得到0000 1101)

3.判斷奇偶性(任意數與1取位與,結果為1則是奇數)

4.取餘操作

#includeusing namespace std; 

int main()

負數按補碼形式參加按位或運算。

1.對某些位置進行置1操作

如將x=1010 1010的第四位置1,則將x |0000 1111得到1010 1111

1.交換兩個數

void swap(int &a, int &b)  

}

2.乙個數異或兩次還是自己,可以用來進行加密,異或兩次得自己,異或一次就得0

3.使特定位翻轉找乙個數,對應x要翻轉的各位,該數的對應位為1,其餘位為零,此數與x對應位異或即可。

例:x=10101110,使x低4位翻轉,用x ^0000 1111 = 1010 0001即可得到。

4.與0異或得到原值

例:x=10101110,用x^0=10101110

左移1位乘以2,左移n位乘以2^n;

右移1位除以2,右移n位除以2^n;

位運算的妙用

做題中常用的位運算有以下幾種 判斷奇偶性 if n 1 else 常用於快速冪和其他判斷奇偶性的地方 乘除2的整次冪 scanf d d n,m 輸出n乘2的m次方 printf d n m 線段樹求左兒子可以用 id 1得到,乙個偶數n 加1可以寫做n 1,如求左兒子可以用 id 1 1得到。sc...

c c 位運算妙用

在vc 程式設計中,會發現微軟的很多api裡面都用到了位運算,比如這個函式 createwindowexa in dword dwexstyle,in opt lpcstr lpclassname,in opt lpcstr lpwindowname,in dword dwstyle,in intx...

位運算的妙用技巧

c c 語言提供的位運算子有 運算子含義功能 按位與兩個二進位制位都為 則該位的結果值為 否則為 按位或兩個二進位制位中只要有乙個為 該位的結果值為 按位異或兩個二進位制位不同則結果為 真 相同則結果為 假 取反乙個二進位制數按位取反,即將 變 將 變 左移左移運算子是用來將乙個數的各二進位制位全部...