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

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

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

/**/
/*
?析出高階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位,它右側有offset位?
*/
??
#define
?mid_ones(width,offset)?????\???
????????(
~
(
-
1
<<
(width)
+
(offset))?
&
?(
-
1
<<
(offset)))???
??

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

/**/
/*
?字的絕對值函數:注意x>>31為0或-1,而x^0=x,x^-1=~x?
*/
??
#define
?abs(x)??(((x)^((x)>>31))-((x)>>31))???
/**/
/*
?絕對值的負值?
*/
??
#define
?nabs(x)??(((x)>>31)-((x)^((x)>>31)))????
/**/
/*
?符號擴展:將第7位向左傳播(位編號從0開始)?
*/
??
#define
?prop7thtolef(x)??((((x)?&?0x000000FF)?^?0x00000080)-0x00000080)???
/**/
/*
?對無符號整數實現算術右移:也可用更簡單的((signed)(x)>>n)?
*/
??
#define
?arithrshiftu(x,n)??((((x)^0x80000000)>>(n))-(0x80000000>>(n)))????????
/**/
/*
?對有符號整數實現邏輯右移:也可用更簡單的((unsigned)(x)>>n)?
*/
??
#define
?logicrshift(x,n)??((((x)^0x80000000)>>(n))+(1<<31-(n)))????
/**/
/*
?符號函數:x>0返回1,x=0返回0,x<0返回-1?
*/
??
#define
?sign(x)??(((x)>0)-((x)<0))???
/**/
/*
?三值比較函數:x>y返回1,x=y返回0,x<y返回-1?
*/
??
#define
?cmp(x,y)??(((x)>(y))-((x)<(y)))???
/**/
/*
??符號傳遞函數:返回采用y的符號后的x?
*/
??
#define
?copysign(x,y)??((abs(x)^((y)>>31))-((y)>>31))????
/**/
/*
?比較謂詞:帶符號整數?
*/
??
#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)???
/**/
/*
?比較謂詞:無符號整數?
*/
????????
#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)???
/**/
/*
?溢出檢測:帶符號運算?
*/
??
#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)???
/**/
/*
?溢出檢測:無符號運算?
*/
??
#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)???
/**/
/*
?循環移位:帶符號整數?
*/
??

/**/
/*
?循環左移n位?
*/
??
#define
?rotlshift(x,n)??((x)<<(n)?|?(unsigned)(x)>>32-(n))???
/**/
/*
?循環右移n位?
*/
??
#define
?rotrshift(x,n)??((unsigned)(x)>>(n)?|?(x)<<32-(n))???
/**/
/*
?循環移位:無符號整數?
*/
??
#define
?rotlshiftu(x,n)??((x)<<(n)?|?(x)>>32-(n))???
#define
?rotrshiftu(x,n)??((x)>>(n)?|?(x)<<32-(n))???
/**/
/*
?正差函數:x>=y時返回x-y,x<y時返回0。注意&優先級高于^,無需要括號?
*/
??
#define
?doz(x,y)??((x)-(y)&~((x)-(y)^((x)^(y))&((x)-(y)^(x)))>>31)???
/**/
/*
?大值函數?
*/
??
#define
?max(x,y)??((y)+doz(x,y))???
/**/
/*
?小值函數?
*/
??
#define
?min(x,y)??((x)-doz(x,y))???
/**/
/*
?下面是無符號版本?
*/
??
#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
)???

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

/**/
/*
?2個常量的循環賦值:當x為a時賦值b,當x為b時賦值a?
*/
??
#define
?rottwo(x,a,b)??do{?x=(a)^(b)^x;?}while(0)???
/**/
/*
?3個常量的循環賦值?
*/
??
#define
?rotthree(x,a,b,c)?????\???
????
do
{?x
=
(
-
(x
==
c)
&
(a
-
c))
+
(
-
(x
==
a)
&
(b
-
c))
+
c;?}
while
(
0
)???
#endif
?
?
|
|
隨筆:64
文章:15
評論:65
引用:0
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
25 | 26 | 27 | 28 | 29 | 30 | 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 | 31 | 1 | 2 | 3 | 4 | 5 |
|
留言簿(14)
隨筆分類
隨筆檔案
收藏夾
最新隨筆
最新評論

閱讀排行榜
|
|