[英]Determining if an integer is a perfect square in assembly (mips32)
我知道如何在 c 中做到這一點。 計算平方根,取平方根的模數 10。 如果模數為 0,則它是一個完美的正方形。
但是我怎么能在匯編中做到這一點,因為我不能在其中做平方根。 有更容易的方法嗎?
你看過牛頓法嗎?
http://en.wikipedia.org/wiki/Newton 's_method
和 mips 中的浮點寄存器
http://en.wikipedia.org/wiki/MIPS_architecture#Floating_point
和另一個類似的線程
您是否嘗試過自己進行任何編碼? 你的裝配水平是多少?
謝謝。
是的,你可以在組裝中做平方根。 浮點數的平方根,即。 如果您的 MIPS CPU 支持浮點指令(現在大多數都支持),它就有 SQRT.D 命令(double 的平方根)。
如果您需要有關算法其余部分的幫助,例如將通用寄存器復制到浮點寄存器,將整數轉換為浮點並返回,FP 算法,請說出來。
可以用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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.