c語言位操作總結

2021-07-25 07:43:39 字數 4249 閱讀 1279

置位

#define bit3 (0x1 << 3)

static int a;

void set_bit3(void)

void clear_bit3(void)

判斷位是否為1 if (a & bit3)

nt a|=(1x=x&0x1011    //把第三位置0

#define bitget(number,pos) ((number) >> (pos)&1)) //用巨集得到某數的某位

#define bitset(number,pos) ((number) |= 1<<(pos)) //把某位置1

#define bitclear(number,pos) ((number) &= ~(1<<(pos)) //把某位置0

#define bitrev(number,pos) ((number) ^= 1<<(pos)) //把number的pos位取反

i = 879 / 16; <=> i = 879 >> 4;

i = 879 % 32; <=> i = 879 - (879>>5<<5); <=> i = 879 & 31;

迴圈移位區別於一般移位的是移位時沒有數字的丟失。迴圈左移時,用從左邊移出的位 填充字的右端,而迴圈右移時,用從右邊移出的位填充字的左側。這種情況在系統程式中時有使用,在一些控制程式中用得也不少。

設有資料說明:

a=01111011,迴圈左移2位 正確結果: 11101101

過程:b=a>>(8-2) 用來得到正常左移丟失的位和迴圈移位後其正確位置 b=00000001;

a=a<<2;左移 a=11101100

a=a|b; a=11101101

如果不是用中間變數 a=(a>>(8-2))|(a<<2)

總長度n(8 16 32)

迴圈左移n (a>>(n-n))|(a>>n)

迴圈右移n (a<<(n-n))|(a>>n)

檢測乙個無符號數是不為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)& amp;((x^y)|~(y-x))//無符號x,y比較   

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

計 算絕對值   

int   abs(   int   x   )     

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

int   sign(int   x)   

三值比較:cmp(x,y)   =   -1,   x< y;   0,   x==y;   1,   x   >   y   

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語言位總結

置位 define bit3 0x1 3 static int a void set bit3 void void clear bit3 void 判斷位是否為1 if a bit3 nt a 1 pos 1 用巨集得到某數的某位 define bitset number,pos number 1 ...

C語言位操作

在電腦程式中,資料的位是可以操作的最小資料單位,理論上可以用 位運算 來 完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做資料變換使用,但是,靈活的位操作可以有效地提高程式執行的效率。c語言提供了位運算的功 能,這使得c語言也能像組合語言一樣用來編寫系統程式。位運算子c語言提供了六種位運算...

c語言位操作

位運算 and與 有一位為0 運算就為0 想獲取高四位,a a 0xf0 簡寫 a 0xf0 清零 一三五七位清零 a a 0x55 檢測位 檢測第三位 a a 0x04 遮蔽高四位,保留低4 位 a a 0x0f 統計2進製a中1的個數 1 include2 int main 3 11 print...