下面使用位運(yùn)算來(lái)實(shí)現(xiàn)一些基本的操作和基本的函數(shù),這些實(shí)現(xiàn)全部都是宏,這是高效率的關(guān)鍵。
/**/
/*
?base.h:基本操作的位運(yùn)算實(shí)現(xiàn)?
*/
??
#ifndef?BASE_H???
#define
?BASE_H???
#define
?word???int???
#define
?uword??unsigned?int???
/**/
/*
?將最右側(cè)的1位改成0位?
*/
??
#define
?right1to0(x)??((x)&((x)-1))???
/**/
/*
?向右傳播最右側(cè)的1位?
*/
??
#define
?right1torig(x)??((x)|((x)-1))???
/**/
/*
?將最右側(cè)的連續(xù)1位串改成0位串?
*/
??
#define
?right1sto0s(x)??(((x)|(x)-1)+1?&?(x))???
/**/
/*
?檢查無(wú)符號(hào)整數(shù)x是否為2的冪,注意&的優(yōu)先級(jí)低于==,需要括號(hào)?
*/
??
#define
?powof2u(x)??(((x)&((x)-1))==0)???
/**/
/*
?檢查無(wú)符號(hào)整數(shù)x是否為2**n-1的形式?
*/
??
#define
?pow2sub1u(x)??(((x)&((x)+1))==0)???
/**/
/*
?檢查無(wú)符號(hào)整數(shù)x是否為2**j-2**k形式?
*/
??
#define
?pow2subpow2u(x)??((((x)|(x)-1)+1?&?(x))==0)???
??

/**/
/*
?下列掩碼直接析出字中指定的位?
*/
??

/**/
/*
?析出最右側(cè)的1位?
*/
??
#define
?right1(x)??((x)?&?-(x))???
/**/
/*
?析出最右側(cè)的0位?
*/
??
#define
?right0(x)??(~(x)&((x)+1))???
/**/
/*
?析出后綴0?
*/
??
#define
?suffix0(x)??(((x)&-(x))-1)???
/**/
/*
?析出最右側(cè)的1位和后綴0(即后綴10 0)?
*/
??
#define
?suffix10s0(x)??((x)?^?(x)-1)???
/**/
/*
?下列掩碼與字做&運(yùn)算,可以析出字中指定的字段?
*/
??

/**/
/*
?析出高階n位(注意n的值不能大于int型的寬度)?
*/
??
#define
?high_ones(n)?(-1<<32-(n))???
/**/
/*
?析出低階n位?
*/
??
#define
?low_ones(n)?(~(-1<<(n)))???
/**/
/*
?析出低階offset位和高階32-offset-width位?
*/
??
#define
?mid_zeros(width,offset)????\???
????????(
-
1
<<
(width)
+
(offset)?
|
?
~
(
-
1
<<
(offset)))???????

/**/
/*
?析出中間width位,它右側(cè)有offset位?
*/
??
#define
?mid_ones(width,offset)?????\???
????????(
~
(
-
1
<<
(width)
+
(offset))?
&
?(
-
1
<<
(offset)))???
??

/**/
/*
?對(duì)無(wú)符號(hào)整數(shù)x,求比x大且與x中的位1個(gè)數(shù)相同的下一個(gè)整數(shù):??
????例如對(duì)nnn0?1111?0000,則下一個(gè)整數(shù)為nnn1?0000?01111。??
????可以用這個(gè)函數(shù)來(lái)遍歷一個(gè)集合的所有子集?
*/
??
#define
?nextsame1u(x)??(right1(x)+(x)?|??????\???
??????(((x)
^
right1(x)
+
(x))
>>
2
)
/
right1(x))???

/**/
/*
?字的絕對(duì)值函數(shù):注意x>>31為0或-1,而x^0=x,x^-1=~x?
*/
??
#define
?abs(x)??(((x)^((x)>>31))-((x)>>31))???
/**/
/*
?絕對(duì)值的負(fù)值?
*/
??
#define
?nabs(x)??(((x)>>31)-((x)^((x)>>31)))????
/**/
/*
?符號(hào)擴(kuò)展:將第7位向左傳播(位編號(hào)從0開(kāi)始)?
*/
??
#define
?prop7thtolef(x)??((((x)?&?0x000000FF)?^?0x00000080)-0x00000080)???
/**/
/*
?對(duì)無(wú)符號(hào)整數(shù)實(shí)現(xiàn)算術(shù)右移:也可用更簡(jiǎn)單的((signed)(x)>>n)?
*/
??
#define
?arithrshiftu(x,n)??((((x)^0x80000000)>>(n))-(0x80000000>>(n)))????????
/**/
/*
?對(duì)有符號(hào)整數(shù)實(shí)現(xiàn)邏輯右移:也可用更簡(jiǎn)單的((unsigned)(x)>>n)?
*/
??
#define
?logicrshift(x,n)??((((x)^0x80000000)>>(n))+(1<<31-(n)))????
/**/
/*
?符號(hào)函數(shù):x>0返回1,x=0返回0,x<0返回-1?
*/
??
#define
?sign(x)??(((x)>0)-((x)<0))???
/**/
/*
?三值比較函數(shù):x>y返回1,x=y返回0,x<y返回-1?
*/
??
#define
?cmp(x,y)??(((x)>(y))-((x)<(y)))???
/**/
/*
??符號(hào)傳遞函數(shù):返回采用y的符號(hào)后的x?
*/
??
#define
?copysign(x,y)??((abs(x)^((y)>>31))-((y)>>31))????
/**/
/*
?比較謂詞:帶符號(hào)整數(shù)?
*/
??
#define
?equal(x,y)?????(~((x)-(y)|(y)-(x))>>31)???
#define
?noteq(x,y)?????(((x)-(y)|(y)-(x))>>31)???
#define
?less(x,y)??????((((x)^(y))?&?((x)-(y)^(x))?^?(x)-(y))>>31)???
#define
?larger(x,y)????((((y)^(x))?&?((y)-(x)^(y))?^?(y)-(x))>>31)???
#define
?lesseq(x,y)????((((x)|~(y))?&?((x)^(y)?|?~((y)-(x))))>>31)???
#define
?largereq(x,y)??((((y)|~(x))?&?((y)^(x)?|?~((x)-(y))))>>31)???
/**/
/*
?比較謂詞:無(wú)符號(hào)整數(shù)?
*/
????????
#define
?equalu(x,y)?????(~((x)-(y)|(y)-(x))>>31)???
#define
?notequ(x,y)?????(((x)-(y)|(y)-(x))>>31)???
#define
?lessu(x,y)??????((~(x)?&?(y)?|?~((x)^(y))?&?(x)-(y))>>31)???
#define
?largeru(x,y)????((~(y)?&?(x)?|?~((y)^(x))?&?(y)-(x))>>31)???
#define
?lessequ(x,y)????(((~(x)|(y))?&?(((x)^(y))?|?~((y)-(x))))>>31)???
#define
?largerequ(x,y)??(((~(y)|(x))?&?(((y)^(x))?|?~((x)-(y))))>>31)???
/**/
/*
?溢出檢測(cè):帶符號(hào)運(yùn)算?
*/
??
#define
?addovf(x,y)??((~((x)^(y))&(((x)+(y))^(x)))>>31)???
#define
?subovf(x,y)??((((x)^(y))&(((x)-(y))^(x)))>>31)???
#define
?mulovf(x,y)??((y)<0?&&?(x)==0x80000000?||?(y)!=0?&&?(x)*(y)/(y)!=(x))???
#define
?divovf(x,y)??((y)==0?||?(x)==0x80000000?&&?(y)==-1)???
/**/
/*
?溢出檢測(cè):無(wú)符號(hào)運(yùn)算?
*/
??
#define
?addovfu(x,y)??(~(x)<(y))??/*?也可用less(~(x),y)?*/???
#define
?subovfu(x,y)??((x)<(y))???/*?也可用less(x,y)?*/???
#define
?mulovfu(x,y)??((y)!=0?&&?(x)?>?0xffffffff/(y))???
#define
?divovfu(x,y)??((y)==0)???
/**/
/*
?循環(huán)移位:帶符號(hào)整數(shù)?
*/
??

/**/
/*
?循環(huán)左移n位?
*/
??
#define
?rotlshift(x,n)??((x)<<(n)?|?(unsigned)(x)>>32-(n))???
/**/
/*
?循環(huán)右移n位?
*/
??
#define
?rotrshift(x,n)??((unsigned)(x)>>(n)?|?(x)<<32-(n))???
/**/
/*
?循環(huán)移位:無(wú)符號(hào)整數(shù)?
*/
??
#define
?rotlshiftu(x,n)??((x)<<(n)?|?(x)>>32-(n))???
#define
?rotrshiftu(x,n)??((x)>>(n)?|?(x)<<32-(n))???
/**/
/*
?正差函數(shù):x>=y時(shí)返回x-y,x<y時(shí)返回0。注意&優(yōu)先級(jí)高于^,無(wú)需要括號(hào)?
*/
??
#define
?doz(x,y)??((x)-(y)&~((x)-(y)^((x)^(y))&((x)-(y)^(x)))>>31)???
/**/
/*
?大值函數(shù)?
*/
??
#define
?max(x,y)??((y)+doz(x,y))???
/**/
/*
?小值函數(shù)?
*/
??
#define
?min(x,y)??((x)-doz(x,y))???
/**/
/*
?下面是無(wú)符號(hào)版本?
*/
??
#define
?dozu(x,y)??((x)-(y)&?arithrshiftu(((x)|~(y))&((x)^(y)|~((x)-(y)))?,31))???
#define
?maxu(x,y)??((y)+dozu(x,y))???
#define
?minu(x,y)??((x)-dozu(x,y))???
/**/
/*
?交換變量的值?
*/
??
#define
?swap(x,y)??????\???
????
do
?
{?x
=
x
^
y;?y
=
y
^
x;?x
=
x
^
y;?}
?
while
(
0
)???

/**/
/*
?根據(jù)掩碼來(lái)交換變量的相應(yīng)字段:??
????當(dāng)m的第i位為1時(shí),交換x,y的第i位;當(dāng)m的第i位為0時(shí),保留x,y的第i位不變??
*/
??
#define
?swapbits(x,y,m)?????\???
????
do
?
{?x
=
x
^
y;?y
=
y
^
(x
&
(m));?x
=
x
^
y;?}
?
while
(
0
)???????

/**/
/*
?2個(gè)常量的循環(huán)賦值:當(dāng)x為a時(shí)賦值b,當(dāng)x為b時(shí)賦值a?
*/
??
#define
?rottwo(x,a,b)??do{?x=(a)^(b)^x;?}while(0)???
/**/
/*
?3個(gè)常量的循環(huán)賦值?
*/
??
#define
?rotthree(x,a,b,c)?????\???
????
do
{?x
=
(
-
(x
==
c)
&
(a
-
c))
+
(
-
(x
==
a)
&
(b
-
c))
+
c;?}
while
(
0
)???
#endif
?
?
|
|
隨筆:64
文章:15
評(píng)論:65
引用:0
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|
留言簿(14)
隨筆分類(lèi)
隨筆檔案
收藏夾
最新隨筆
最新評(píng)論

閱讀排行榜
|
|