确定整数是否是装配中的完美正方形(mips32)

时间:2014-03-24 13:48:25

标签: c assembly mips32

我知道怎么做c。 计算平方根,取平方根的模数10。 如果模数为0,那么它就是一个完美的正方形。

但是我怎么能在装配中做到这一点,因为我不能在其中做一个平方根。 有更简单的方法吗?

3 个答案:

答案 0 :(得分:3)

你看过牛顿的方法吗?

http://en.wikipedia.org/wiki/Newton's_method

以mips为单位的浮点寄存器

http://en.wikipedia.org/wiki/MIPS_architecture#Floating_point

另一个类似的线程

Finding square root of an integer on MIPS assembly

你自己尝试过编码吗?你的装配水平是多少?

感谢。

答案 1 :(得分:0)

是的,你可以在装配中做平方根。浮点数的平方根,即。如果您的MIPS CPU支持浮点指令(这些指令大多数都是这些天),则它具有SQRT.D命令(平方根为double)。

如果您需要有关算法其余部分的帮助,请执行以下操作: G。将通用寄存器复制到浮点寄存器,将整数转换为浮点数和返回值,FP算法,请说明。

答案 2 :(得分:0)

您可以在C或C ++中实现它,然后查看反汇编。

为了有效地做到这一点,我建议使用迭代二进制搜索:

int isSquare(unsigned int num)
{
    unsigned int lo = 0;
    unsigned int hi = num;
    do
    {
        unsigned int mid = (hi+lo)/2;
        unsigned int square0 = mid*mid;
        unsigned int square1 = (mid+1)*(mid+1);
        if (num == square0 || num == square1)
            return 1;
        if (num < square0)
            hi = mid;
        else // if (num > square1)
            lo = mid;
    }
    while (lo+1 < hi);
    return 0;
}

请注意,此功能的任何输入都不能大于2^(num_of_bits_per_int/2+1)-3