>

따라서 2 개의 레지스터 ($s0&$s1) 중 2 개의 숫자를 읽고이 두 숫자가 다른 비트 수를 계산하는 MIPS 어셈블리 프로그램을 만들어야합니다. 그리고 결과를 $s2 레지스터에 저장합니다. 또한 가능한 최소한의 명령으로 위의 모든 것을 수행해야합니다. XOR 연산으로 종이에 몇 가지를 시도했지만 다른 비트의 양을 계산하는 방법을 알 수는 없습니다.

다른 사람이 도와 줄 수 있다면, 그 이상을 환영합니다. 미리 감사드립니다


  • 답변 # 1

    비트를 함께 XOR 한 다음 결과 숫자의 비트 수를 계산합니다. 이렇게하려면 각 비트를 반복하고 비트 마스크와 비트 시프트를 사용하여 비트 비트가 설정되어 있는지 확인한 다음 카운터를 증가시킬 수 있습니다.

    이러한 모호함을 의도적으로 남겨두고 있습니다.

  • 답변 # 2

    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 밉 명령이 필요합니다.

  • 답변 # 3

    루프리스 팝 카운트 코드를 사용하는 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
    
    

관련 자료

  • 이전 azure search - 각 패싯에 대한 최상위 문서 반환
  • 다음 python - Pyodbc 변수 쿼리