位運算的妙用

2022-09-10 18:24:14 字數 1400 閱讀 3365

做題中常用的位運算有以下幾種:

判斷奇偶性

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得到。

scanf("

%d%d

", &n, &m);

//輸出n除2的m次方

printf("

%d", n >> m);

同理除2的整次冪也可以用右移運算子

不開闢新空間交換a和b的值

a ^=b;

b ^=a;

a ^= b;

3和4都是利用兩個相同的數異或等於0實現的。

a ^= b之後    a = a ^ b;                b = b;

b ^= a之後    a = a ^ b;                b = b ^ a ^b = a;

a ^= b之後    a = a ^ b ^ a = b;    b = a;

在乙個陣列中有n個數出現兩次,還有1個數出現1次,求出現了一次的那個數

int ans = 0

;for (int i = 0; i < 2 * n + 1; i++)

printf("%d

", ans);

這種位運算的用法還有乙個變種是在乙個長度為1001的陣列中只有1到1000這1000個數,並且只有1個數出現了兩次,其他數都只出現一次,求出現兩次的數

//

假設這1001個數是從arr[1]到arr[1001]存的

int ans = 0

;for (int i = 1; i <= 1001; i++)

printf("%d

", ans);

由於我們知道1到1000只有乙個數出現兩次其他數都只出現一次,那麼我們在補上乙個1到1000,使其他數都出現兩次,唯一乙個本來就有出現兩次的數出現三次,最後出現兩次的數都消掉之後剩下的就是唯一出現兩次的數;

不用判斷語句求n的絕對值

int temp = n >> 31

;printf("%d

", (n ^ temp) - temp);

如果n為負數temp = -1,否則為0;乙個數異或0等於本身然後減0還是本身,乙個數異或-1相當於取反,然後減-1相當於加1,轉為正數;

位運算的妙用

位運算的操作 負數是按照補碼的形式參與按位與運算的 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.1為正,0為負 反碼的表示方法是 正數的反碼是其本身 負數的反碼是在其原碼的基礎上,符號位不變,其餘各個位取反.補碼的表示方法是 正數的補碼就是其本身 負數的補碼是在其原碼的基礎上,...

c c 位運算妙用

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

位運算的妙用技巧

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