(3) 將int型變量a的第k位清0,即a=a&~(1<<k) (10000 取反后為00001 )
(4) 將int型變量a的第k位置1,即a=a|(1<<k)
(5) int型變量循環(huán)左移k次,即a=a<<k|a>>16-k (設(shè)sizeof(int)=16)(6) int型變量a循環(huán)右移k次,即a=a>>k|a<<16-k (設(shè)sizeof(int)=16)
(7)對(duì)于一個(gè)數(shù) x >= 0,判斷是不是2的冪。
boolean power2(int x){ return ( (x&(x-1))==0) && (x!=0);}
(8)不用temp交換兩個(gè)整數(shù)void swap(int x , int y){ x ^= y; y ^= x; x ^= y;}(9)計(jì)算絕對(duì)值
int abs( int x ){ int y ; y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y}
(10)取模運(yùn)算轉(zhuǎn)化成位運(yùn)算 (在不產(chǎn)生溢出的情況下) a % (2^n) 等價(jià)于 a & (2^n - 1)(11)乘法運(yùn)算轉(zhuǎn)化成位運(yùn)算 (在不產(chǎn)生溢出的情況下) a * (2^n) 等價(jià)于 a<< n(12)除法運(yùn)算轉(zhuǎn)化成位運(yùn)算 (在不產(chǎn)生溢出的情況下) a / (2^n) 等價(jià)于 a>> n 例: 12/8 == 12>>3(13) a % 2 等價(jià)于 a & 1 (14) if (x == a)x= b; else x= a; 等價(jià)于 x= a ^ b ^ x;(15) x 的 相反數(shù) 表示為 (~x+1)(16)輸入2的n次方:1 << 19(17)乘除2的倍數(shù):千萬(wàn)不要用乘除法,非常拖效率。只要知道左移1位就是乘以2,右移1位就是除以2就行了。比如要算25 * 4,用25 << 2就好啦
實(shí)例 功能 | 示例 | 位運(yùn)算 ----------------------+---------------------------+-------------------- 去掉最后一位 | (101101->10110) | x >> 1 在最后加一個(gè)0 | (101101->1011010) | x < < 1 在最后加一個(gè)1 | (101101->1011011) | x < < 1+1 把最后一位變成1 | (101100->101101) | x | 1 把最后一位變成0 | (101101->101100) | x | 1-1 最后一位取反 | (101101->101100) | x ^ 1 把右數(shù)第k位變成1 | (101001->101101,k=3) | x | (1 < < (k-1)) 把右數(shù)第k位變成0 | (101101->101001,k=3) | x & ~ (1 < < (k-1)) 右數(shù)第k位取反 | (101001->101101,k=3) | x ^ (1 < < (k-1)) 取末三位 | (1101101->101) | x & 7 取末k位 | (1101101->1101,k=5) | x & ((1 < < k)-1) 取右數(shù)第k位 | (1101101->1,k=4) | x >> (k-1) & 1 把末k位變成1 | (101001->101111,k=4) | x | (1 < < k-1) 末k位取反 | (101001->100110,k=4) | x ^ (1 < < k-1) 把右邊連續(xù)的1變成0 | (100101111->100100000) | x & (x+1) 把右起第一個(gè)0變成1 | (100101111->100111111) | x | (x+1) 把右邊連續(xù)的0變成1 | (11011000->11011111) | x | (x-1) 取右邊連續(xù)的1 | (100101111->1111) | (x ^ (x+1)) >> 1 去掉右起第一個(gè)1的左邊 | (100101000->1000) | x & (x ^ (x-1)) 判斷奇數(shù) (x&1)==1 判斷偶數(shù) (x&1)==0
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注