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