當前位置:
首頁 >
位运算1
發布時間:2025/4/14
19
豆豆
學過C/C++一定學過位運算,但是大多數教科書上僅僅介紹了運算符的基本用法,沒有提到位運算的應用,借此,本人特地收集了位運算的基本應用,希望大家能體會位運算的奧妙之處。
首先還是先介紹一遍一些基本的運算符:&(按位與)、|(按位或)、^(按位異或)、~ (按位取反)、>> (右移運算)、<<(左移運算)。具體意義書上都有,在此就不多闡述。
以下文章僅僅對位運算做拋磚引玉,其他進階應用會在今后的文章中補充! 1. 變量交換 首先說個好玩的——詭異的變量交換。 交換兩個int變量平時寫程序會經常用到,當時,常規方法都要用三個變量,但是位運算里不需要第三個變量,僅僅需做三次異或運算: a ^= b; b ^= a; a ^= b; 經過這樣的三次異或運算后, a、b兩個變量的值就交換過來了,原理?原因是異或運算的逆運算就是自己,也就是一個數對一個數異或運算兩次就是其本身。 2. 位運算實現int型快速乘法運算 判斷奇偶性(對2取余): a&1 == 0 ? ?偶數 a&1 == 1 ? ?奇數 計算2^n 1 << n 對2^n做乘法或除法: a << n ?等價于 ?a * (2 ^ n) a >> n ?等價于 ?a / (2 ^ n) 看到這里,也許大家會很納悶,好好的乘法除法為什么要寫成位運算呢? 其實,位運算的操作單元是bit,運算效率能提高60%。 在平時寫程序的過程中,適當應用這些運算,可以大大提高程序的運行速度,下面以經典的二分求冪做一個例子: int Power(int a, int n, int mod) // cal (a^n)%mod { int ans = 1; while (n > 0) { if (n & 1) { ans *= a; n--; } else { a *= a; n >>= 1; } ans %= mod; } return ans; } 3. 位運算的其他應用 (1) 取int型變量a的第k位 (k=0,1,2……sizeof(int)) a>>k&1 (2) 將int型變量a的第k位清0 a=a&~(1<<k) (3) 將int型變量a的第k位置1 a=a|(1<<k) (4) int型變量循環左移k次 a=a<<k|a>>16-k ? (設sizeof(int)=16) (5) int型變量a循環右移k次 a=a>>k|a<<16-k ? (設sizeof(int)=16) (6) 實現最低n位為1,其余位為0的位串信息: ~(~0 << n) (7)截取變量x自p位開始的右邊n位的信息: (x >> (1+p-n)) & ~(~0 << n) (8)截取old變量第row位,并將該位信息裝配到變量new的第15-k位 new |= ((old >> row) & 1) << (15 – k) (9)設s不等于全0,代碼尋找最右邊為1的位的序號j: for(j = 0; ((1 << j) & s) == 0; j++) ;
總結
- 上一篇: Command of SVN for l
- 下一篇: Dead Lock