圆整(roundup)--数据块对齐,内存对齐

 static int roundup(int x, int y)
        {
            return ((((x) + (y) - 1) / (y)) * (y));
        }

或者

 static int roundup(int x, int y)
        {
            return ((((x) - 1) / (y)+1) * (y));
        }

一下转自他人帖子:对圆整的理解

一般在考虑到内存对齐的程序里面势必要使用数的圆整算式,一般来说在计算机程序里一般都是圆整到2的次幂上,而很多书上也有很多基于'移位'操作的圆整到2的次幂上的算法公式,形式都是很简单的,很实用。

这里要说的是一个圆整到任意正整数(n > 1,圆整到1没有必要^_^)的算式,突然觉得如果说算法有些大了。我们来推导一下,也不是严密推导。就是怎么想的怎么说。

如果有两个正整数a、b,其中a >= 1, b > 1,求a圆整于b后的结果?

这里不妨考虑三种情况:
(1) a = b
毫无疑问结果应该就是b;

(2) a > b
a > b > 1 => a/b >= 1(计算机语言中的a/b) => 圆整结果为(a/b + 1) * b;---(1)

(3) a < b
1 =< a < b => a/b = 0 (计算机语言中的a/b) => 圆整结果为b <=> (0 + 1) * b => (a/b + 1) * b。---(2)

从上面式子可以看出当a b时可以统一成(a/b + 1) * b,但是a = b时 (a/b + 1) *b = 2b显然和正确结果b不符。这时如何统一算式呢?我们从条件考虑:
假设我们现在有一个x = a - 1 > b > 1,从x > b我们可以通过代入上面的公式(1)得出圆整结果:(x/b + 1) * b,这里a有了更严格的限制 a > 2;同样有一个 1 =< x = a - 1 < b,同样代入上面的公式(2)可以得出圆整结果: (x/b +1) * b,这里a >= 2了。

由上面两个结果,可以推出另一个形式的圆整算式: ((a - 1)/b + 1) * b,它对于(a >=2,b > 1成立)
那么当1 =

这样((a - 1)/b + 1) * b对于a >=1,b >1就都成立了,这个算式形式就统一了^_^。

#define ROUNDTO(a, boundary) ((((a) - 1)/(boundary) + 1) * (boundary))

//测试一下
std::cout << ROUNDTO(1, 2) 输出结果:
2

转自http://bigwhite.blogbus.com/logs/5503006.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值