数的圆整算式
一般在考虑到内存对齐的程序里面势必要使用数的圆整算式,一般来说在计算机程序里一般都是圆整到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 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 = 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
3
21
7
© 2007, bigwhite. 版权所有.
Related posts:
博主推导的x部分,有点没看明白。我自己的想法是这样的,请指正:
如果有两个正整数a、b,其中a >= 1, b > 1,求a圆整于b后的结果f(a)?
f(a) = [a除以b向上取整]*b;
f(a) = [ a/b + (a%b==0 ? 0 : 1) ]*b;(计算机语言);
说的再细一点:
(1) 若a=n*b, 其中n>=1,则f(a)=n*b;
(2) 若a=n*b+c, 其中n>=0, 1<=c<=b-1,则f(a)=(n+1)*b;
即(1):f(a)=(a/b+0)*b;
(2):f(a)=(a/b+1)*b;
怎样将两者统一起来呢?
(1): f(a)=[(a-m)/b+1]*b,1<=m<=b-1;
(2): f(a)=[(a-m)/b+1]*b,1<=m<=c;
取一个公共值,因为c>=1,则取m=1,即f(a)=[(a-1)/b+1]*b;
或者
(1): f(a)=[(a+m)/b]*b,0<=m<=b-1;
(2): f(a)=[(a+m)/b]*b,b-c<=m<=b-c+b-1;
取一个公共值,则取m=b-1,即f(a)=[(a+b-1)/b]*b;