gcd是Greatest Common Divisor的缩写,欧几里得最大公约数运算,GCD(A,B)得到A和B最大的公约数,关于该公式的证明可以参数:
这里主要说明该定理在编程中的应用。
情形一:画布一般是内存表面,画完之后一次性blit到framebuffer上显示出来,但是显示分辨率如果可设置,用户改变分辨率,这画布和framebuffer大小可能就不匹配了,这时将画布上一小块区域同步到framebuffer,坐标对焦是个问题,这时就可能会用到gcd:
static U32 start_coord(U32 * p_a_val, U32 a_max, U32 b_max)
{
U32 b_val = 0;
U32 gcd = 1;
U32 a_val = 0;
if(p_a_val==NULL) return 0;
if((a_max==0) || (b_max == 0))
{
* p_a_val = 0;
return 0;
}
gcd = get_euclid_gcd(a_max, b_max);
if(gcd==0) gcd = 1;
a_max /=gcd;
b_max /=gcd;
a_val = * p_a_val;
b_val =a_val /a_max +1;
* p_a_val =b_val *a_max;
b_val = b_val * b_max ;
return b_val;
}
U32 get_euclid_gcd(U32 max, U32 min)
{
U32 r,temp;
if((min == 0) || (max==0))
{
return 1;
}
if(max<min)
{
temp=max;
max=min;
min=temp;
}
while(min!=0)
{
r=max%min;
max=min;
min=r;
}
if(max == 0) return 1;
return max;
}