MIPS汇编中2个二进制数之间的位差

时间:2019-05-29 17:04:03

标签: assembly mips smips

因此,我必须创建一个MIPS汇编程序,该程序从2个寄存器($ s0和$ s1)中读取2个数字,并计算这2个数字相差的位数。并将结果存储在$ s2寄存器中。 我还必须用最少的命令来完成以上所有工作。 我已经在纸上用XOR操作尝试了一些东西,但是我还不太清楚如何计算不同位数的大小。

如果有人可以帮助您,我们将非常欢迎您。 预先感谢

3 个答案:

答案 0 :(得分:3)

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

我故意让这个模糊不清,因为这是供您找出。

答案 1 :(得分: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指令。

答案 2 :(得分: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