所以我必须创建一个 MIPS 汇编程序,从 2 个寄存器($s0 和 $s1)中读取 2 个数字,并计算这 2 个数字不同的位数。并将结果存储在 $s2 寄存器中。我还必须用尽可能少的命令来完成上述所有操作。我在纸上用异或运算尝试了一些东西,但我不太清楚如何计算不同位的数量。
如果有人可以提供帮助,我们非常欢迎您。提前致谢
对这些位进行异或运算,然后计算结果数中的位数。为此,您可以遍历每个位,检查它是否已设置(通过使用位掩码和位移位),然后增加一个计数器。
我故意把这个模糊不清,因为这是让你弄清楚的。
C 中使用无循环弹出计数代码的示例:
int x, y, z;
// ...
z = x^y; // x and y are inputs
z -= (z >> 1) & 0x55555555; // 16 2 bit counts
z = (z & 0x33333333) + ((z >> 2) & 0x33333333); // 8 4 bit counts
z = (z + (z >> 4)) & 0x0f0f0f0f; // 4 8 bit counts
z = (z * 0x01010101) >> 24; // 1 32 bit count
这是一种避免在 32 位上循环的方法。它反复清除所有位,但最左边的一位,同时计算它们的数量。
// x and y are the bits to compare
int z=x^y; // only bits different between x and y are set
int w;
int cnt=0;
while(w=z&-z) { //w only has the left bit in z set
cnt++;
z^=w; // clear the processed bit
}
它基于众所周知的属性,x&-x
即等于 中的较低权重设置位x
。
内循环需要 5 个 mips 指令。