2^n 字节对其算法(Linux内核)

来自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$ 
*/

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值