将整数分解为两个字节

时间:2013-04-06 13:58:17

标签: math language-agnostic embedded

我正在开发一个嵌入式项目,我必须将超时值写入某个微芯片的两个字节寄存器。

超时定义为:

   timeout = REG_a * (REG_b +1)

我想使用256的整数来编程这些寄存器,比方说60000.我正在寻找一种算法,给定超时值,计算REG_a和REG_b。

如果无法获得确切的解决方案,我希望获得下一个更大的超时值。

到目前为止我做了什么:

我当前的解决方案计算:

   temp = integer_square_root (timeout) +1;
   REG_a = temp;
   REG_b = temp-1;

这导致在实践中运作良好的值。但是,我想看看你们是否能提出更优化的解决方案。

哦,而且我受内存限制,所以大表是不可能的。运行时间也很重要,所以我不能简单地强制解决方案。

2 个答案:

答案 0 :(得分:2)

您可以使用该答案Algorithm to find the factors of a given Number.. Shortest Method?中使用的代码来查找超时因素。

n = timeout 
initial_n = n
num_factors = 1;
for (i = 2; i * i <= initial_n; ++i) // for each number i up until the square root of the given number
{
    power = 0; // suppose the power i appears at is 0
    while (n % i == 0) // while we can divide n by i
    {
        n = n / i // divide it, thus ensuring we'll only check prime factors
        ++power // increase the power i appears at
    }
    num_factors = num_factors * (power + 1) // apply the formula
}

if (n > 1) // will happen for example for 14 = 2 * 7
{
    num_factors = num_factors * 2 // n is prime, and its power can only be 1, so multiply the number of factors by 2
}
REG_A = num_factor

第一个因素是你的REG_A,所以你需要找到另一个乘以等于超时的值。

for (i=2; i*num_factors != timeout;i++);
REG_B = i-1

答案 1 :(得分:1)

有趣的问题,Nils!

假设您首先修复其中一个值,比如说Reg_a,然后按分组计算Reg_b:Reg_b = ((timeout + Reg_a-1) / Reg_a) -1

然后你知道你很近,但有多接近?那么错误的上限就是Reg_a,对吗?因为错误是除法的剩余部分。

如果您使一个因素尽可能小,那么计算另一个因素,您将使误差的上限尽可能小。

另一方面,通过使两个因子接近平方根,你使除数尽可能大,从而使误差尽可能大

所以:

首先,Reg_a的最小值是多少? (timeout + 255) / 256;

然后如上所述计算Reg_b。

这并不是所有情况下的绝对最小组合,但它应该比使用平方根更好,也更快。