ALIGN(x, mask)函数详解

来源:互联网 发布:淘宝上的lolita代购 编辑:程序博客网 时间:2024/05/16 18:49

ALIGN(x, mask)函数详解

详细定义为:

#define ALIGN(x, mask)  (((x) + ((mask)-1)) & ~((mask)-1))


功能为:对x取mask的整数倍,如果x没有达到mask的最接近整数倍,补值达到最近的整数倍


实例:

设x=5,mask=32

~(mask-1):-32____((x) + (mask-1)):36____((x) + (mask-1)) & ~(mask-1)):32
~(mask-1):ffffffe0____((x) + (mask-1)):24____((x) + (mask-1)) & ~(mask-1)):20


从上面可以看出:~(maks-1)=0xffffffe0,是让低位为5个0,再和其它值去&运算,就相当于是其它值小于32位的部分被直接去掉为0,为了达到超过32的目的,需要让除0外的任何一个值都要达到或超过32,

                         如0,加32-1值,对应为31,去掉小于32的部分,就是0

 如1,加32-1值,对应为32,去掉小于32的部分,就是32

 如2,加32-1值,对应为33,去掉小于32的部分,就是32

                          。。。。。。

 如31,加32-1值,对应为62,去掉小于32的部分,就是32                   

32,加32-1值,对应为63,去掉小于32的部分,就是32

                       如33,加32-1值,对应为64,去掉小于32的部分,就是64

                     依次类推:对于前32个数内为0的,保持不变

                                      对于前32个数内,为1~31的,去掉低于32的部分,并加32

                                      高于32部分不受影响。

限制,

1.这个算法,要求mask,必须对应为2^n次方才行,如果不是,就会报错。如mask 为31时的值

x:   5  mask:  31=====33
x:  10  mask:  31=====32
x:  15  mask:  31=====33
x:  16  mask:  31=====32
x:  17  mask:  31=====33

2.x和mask必须为整数,且不要为负。

                      

0 0