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=====33x: 10 mask: 31=====32x: 15 mask: 31=====33x: 16 mask: 31=====32x: 17 mask: 31=====33
2.x和mask必须为整数,且不要为负。
新闻热点
疑难解答