做題中常用的位運算有以下幾種:
判斷奇偶性
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 語言提供的位運算子有 運算子含義功能 按位與兩個二進位制位都為 則該位的結果值為 否則為 按位或兩個二進位制位中只要有乙個為 該位的結果值為 按位異或兩個二進位制位不同則結果為 真 相同則結果為 假 取反乙個二進位制數按位取反,即將 變 將 變 左移左移運算子是用來將乙個數的各二進位制位全部...