计算设置的位数

时间:2010-09-22 04:05:21

标签: assembly mips

我想计算设置的二进制数中的位数。 例如,用户输入数字97,即二进制的01100001。程序应该让我使用MIPS ISA设置3位。

我能够在C中实现这一点,但我不知道如何使用汇编代码实现它。

有什么想法吗?

提前感谢所有帮助。

这不是HW,它是我研究项目的一小部分。

3 个答案:

答案 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比引用缓存慢(通过算法运行大约一百万个数字)。