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