来自Linux内核算法(kernel.h)
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
测试代码:
#include <error.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
int main()
{
int a = 3;
printf("align = %d\n", ALIGN(a, 1));
printf("align = %d\n", ALIGN(a, 2));
printf("align = %d\n", ALIGN(a, 3));
printf("align = %d\n", ALIGN(a, 4));
printf("align = %d\n", ALIGN(a, 5));
printf("align = %d\n", ALIGN(a, 7));
printf("align = %d\n", ALIGN(a, 8));
printf("align = %d\n", ALIGN(a, 9));
printf("align = %d\n", ALIGN(a, 15));
printf("align = %d\n", ALIGN(a, 16));
printf("align = %d\n", ALIGN(a, 17));
printf("align = %d\n", ALIGN(a, 31));
printf("align = %d\n", ALIGN(a, 32));
printf("align = %d\n", ALIGN(a, 33));
printf("align = %d\n", ALIGN(a, 63));
printf("align = %d\n", ALIGN(a, 64));
printf("align = %d\n", ALIGN(a, 65));
printf("align = %d\n", ALIGN(a, 127));
printf("align = %d\n", ALIGN(a, 128));
printf("align = %d\n", ALIGN(a, 129));
return 0;
}
/* 结果: 该算法只有在要求2^n字节对其时才能成立
align = 3
align = 4
align = 5
align = 4
align = 3
align = 9
align = 8
align = 3
align = 17
align = 16
align = 3
align = 33
align = 32
align = 3
align = 65
align = 64
align = 3
align = 129
align = 128
align = 3
book@gui_hua_shu:~/test$
*/