1

所以我必须创建一个 MIPS 汇编程序,从 2 个寄存器($s0 和 $s1)中读取 2 个数字,并计算这 2 个数字不同的位数。并将结果存储在 $s2 寄存器中。我还必须用尽可能少的命令来完成上述所有操作。我在纸上用异或运算尝试了一些东西,但我不太清楚如何计算不同位的数量。

如果有人可以提供帮助,我们非常欢迎您。提前致谢

4

3 回答 3

3

对这些位进行异或运算,然后计算结果数中的位数。为此,您可以遍历每个位,检查它是否已设置(通过使用位掩码和位移位),然后增加一个计数器。

我故意把这个模糊不清,因为这是让你弄清楚的。

于 2019-05-29T17:07:48.653 回答
0

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
于 2019-05-29T21:20:28.460 回答
0

这是一种避免在 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 指令。

于 2019-05-29T17:17:39.370 回答