C C 位操作技巧

2021-04-25 01:53:25 字數 3161 閱讀 2549

檢測乙個無符號數是不為2^n-1(^為冪):   x&(x+1)   

將最右側0位改為1位:   x   |   (x+1)   

二進位制補碼運算公式:   

-x   =   ~x   +   1   =   ~(x-1)   

~x   =   -x-1     

-(~x)   =   x+1   

~(-x)   =   x-1   

x+y   =   x   -   ~y   -   1   =   (x|y)+(x&y)     

x-y   =   x   +   ~y   +   1   =   (x|~y)-(~x&y)     

x^y   =   (x|y)-(x&y)   

x|y   =   (x&~y)+y   

x&y   =   (~x|y)-~x   

x==y:         ~(x-y|y-x)   

x!=y:         x-y|y-x   

x<   y:         (x-y)^((x^y)&((x-y)^x))   

x<=y:         (x|~y)&((x^y)|~(y-x))   

x<   y:         (~x&y)|((~x|y)&(x-y))//無符號x,y比較   

x<=y:         (~x|y)&((x^y)|~(y-x))//無符號x,y比較   

使用位運算的無分支**:   

計算絕對值   

int   abs(   int   x   )     

符號函式:sign(x)   =   -1,   x<0;   0,   x   ==   0   ;   1,   x   >   0   

int   sign(int   x)   

三值比較:cmp(x,y)   =   -1,   xy   

int   cmp(   int   x,   int   y   )   

doz=x-y,   x>=y;   0,   x>31)   ;   

}   

int   max(int   x,   int   y   )     

不使用第三方交換x,y:   

1.x   ^=   y   ;   y   ^=   x   ;   x   ^=   y   ;   

2.x   =   x+y   ;   y   =   x-y   ;   x   =   x-y   ;   

3.x   =   x-y   ;   y   =   y+x   ;   x   =   y-x   ;   

4.x   =   y-x   ;   x   =   y-x   ;   x   =   x+y   ;     

雙值交換:x   =   a,   x==b;   b,   x==a//常規編碼為x   =   x==a   ?   b   :a   ;   

1.x   =   a+b-x   ;   

2.x   =   a^b^x   ;   

下捨入到2的k次方的倍數:   

1.x   &   ((-1)<>k)<>1)&0x55555555)   ;   

x   =   (x&0x33333333)   +   ((x>>2)   &   0x33333333   )   ;   

x   =   (x+(x>>4))   &   0x0f0f0f0f   ;   

x   =   x   +   (x>>8)   ;   

x   =   x   +   (x>>16)   ;   

return   x   &   0x0000003f   ;   

}   

2.   

int   pop(unsigned   x)      ;   

return   table[x&0xff]+table[(x>>8)&0xff]+table[(x>>16)&0xff]+table[(x>>24)]   ;   

}   

奇偶性計算:   

x   =   x   ^   (   x>>1   )   ;   

x   =   x   ^   (   x>>2   )   ;   

x   =   x   ^   (   x>>4   )   ;   

x   =   x   ^   (   x>>8   )   ;   

x   =   x   ^   (   x>>16   )   ;   

結果中位於x最低位,對無符號x,結果的第i位是原數第i位到最左側位的奇偶性   

位反**   

unsigned   rev(unsigned   x)   

遞增位反轉後的數:   

unsigned   inc_r(unsigned   x)   

while(   x   <   m   )   ;   

return   x   ;   

}   

混選位:   

abcd   efgh   ijkl   mnop   abcd   efgh   ijkl   mnop->aabb   ccdd   eeff   gghh   iijj   kkll   mmnn   oopp   

unsigned   ps(unsigned   x)   

位壓縮:   

選擇並右移字x中對應於掩碼m的1位的位,如:compress(abcdefgh,01010101)=0000bdfh   

compress_left(x,m)操作與此類似,但結果位在左邊:   bdfh0000.   

unsigned   compress(unsigned   x,   unsigned   m)   

gray碼到二進位製碼:   

unsigned   g2b(unsigned   g)   

找出最左0位元組的位置:   

int   zbytel(   unsigned   x   )   

;   

unsigned   y   ;   

y   =   (x&0x7f7f7f7f)   +   0x7f7f7f7f   ;   

y   =   ~(y|x|0x7f7f7f7f)   ;   

return   table[y*0x00204081   >>   28]   ;//乘法可用移位和加完成   

}   

C C 位操作 位運算

在c語言中,可以單獨操控變數的位 bit 一般高階語言不會處理這級別的細節,c在提供高階語言便利的同時,還能為組合語言所保留的級別上工作,這使其成為編寫裝置驅動程式和嵌入式 的首選語言。目錄 二進位制整數 binary 有符號整數 八進位制 octal 十六進製制 hex 位運算子 按位與 的用途 ...

位操作技巧

檢測乙個無符號數是不為2 n 1 為冪 x x 1 將最右側0位改為1位 x x 1 二進位制補碼運算公式 x x 1 x 1 x x 1 x x 1 x x 1 x y x y 1 x y x y x y x y 1 x y x y x y x y x y x y x y y x y x y x ...

位操作技巧

檢測乙個無符號數是不為2 n 1 為冪 x x 1 將最右側0位改為1位 x x 1 二進位制補碼運算公式 x x 1 x 1 x x 1 x x 1 x x 1 x y x y 1 x y x y x y x y 1 x y x y x y x y x y x y x y y x y x y x ...