我想计算设置的二进制数中的位数。 例如,用户输入数字97,即二进制的01100001。程序应该让我使用MIPS ISA设置3位。
我能够在C中实现这一点,但我不知道如何使用汇编代码实现它。
有什么想法吗?
提前感谢所有帮助。
这不是HW,它是我研究项目的一小部分。
答案 0 :(得分:4)
您所寻找的通常被称为人口数(popcount)。
Bit Twiddling Hacks上有许多C实现(其中一些实际上很聪明)。如果您熟悉C,那么在分解表达式后,每种方法都应该合理地转换为MIPS程序集。
如果您的输入域很小(例如0-255),您可以随时执行查找表并使用输入作为偏移量来直接获取popcount。
答案 1 :(得分:1)
因为这听起来像家庭作业,我不会给出MIPS代码,但这是算法(用C语言编写)。转换为MIPS应该很简单:
int bits(unsigned int number)
{
// clear the accumulator
int accumulator = 0;
// loop until our number is reduced to 0
while (number != 0)
{
// add the LSB (rightmost bit) to our accumulator
accumulator += number & 1;
// shift the number one bit to the right so that a new
// bit is in the LSB slot
number >>= 1;
}
return accumulator;
}
答案 2 :(得分:0)
Chris给出的链接提供了一些比特计数的好方法。我建议this method,因为它既快速又不需要循环但只需按位操作,这在组装中更容易。
您可能获得汇编代码的另一种方法是使用C编写代码,编译它然后查看输出汇编(大多数编译可以生成汇编文件输出(-S用于gcc,但请确保通过-O0以便于理解代码),或者允许您查看反汇编的二进制文件)。它应该指向正确的方向。
作为一则轶事,我在PowerPC上做了一些测试(不是MIPS,我知道......),以便以最快的方式计算32位int中的位数。我链接的方法是远远超过所有其他方法的方法,直到我做了一个字节大小的查找表并解决了4次。看起来ALU比引用缓存慢(通过算法运行大约一百万个数字)。