C語言位總結

2021-08-26 19:33:01 字數 4038 閱讀 5860

置位 

#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<<(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)

{

unsigned b ;

b = g ^ (g>>1) ;

b = g ^ (g>>2) ;

b = g ^ (g>>4) ;

b = g ^ (g>>8) ;

c語言位操作總結

置位 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 po...

C語言中 位運算總結

位運算子包括 按位與,按位或 按位異或 and 位與 or 位或 xor 位異或 1 1 1,1 1 1,1 1 0 1 0 0,1 0 1,1 0 1 0 1 0,0 1 1,0 1 1 0 0 0,0 0 0,0 0 0 位運算 位運算的運算分量只能是整型或字元型資料,位運算把運算物件看作是由二...

C語言 位運算相關總結

1.位運算符號 取反,不分正負數 標準規定在右邊補0 正數則左邊補0,負數標準沒有規定在左邊補充的數字,分為邏輯右移和算術右移,具體由編譯器決定,windows平台和gcc採取算術右移即負數補1 2.常見的二進位制位的變換操作 去掉最後一位 101101 10110 x 1 在最後加乙個0 1011...