2014-02-15 3 views
3

이 내 코드입니다 - 고전 곱셈 A * B = C바이트 배열 곱셈

private static int MASK = 0x00ff; 
public static int multiplication(byte[] A, byte[] B, byte[] R) 
{ 
    byte n = 0; 
    int bb; 
    int sum = 0; 
    int lenbyte = 0; 

    for (int c = 0; c < R.Length; c++) //R set 0 
    { 
     R[c] = 0; 
    } 

    int j = B.Length - 1; 
    int i = 0; 

    do //cycles go throught bytes of B from LSB to MSB 
    { 
     bb = B[j] & MASK; 
     if (bb != 0x00) 
     { 
      i = A.Length - 1; 
      n = 0x00; //carry byte 

      do //cycles throught bytes of A from LSB to MSB 
      { 
       sum = ((A[i] & MASK) * bb) + (R[i + j+1 ]&MASK) + (n & MASK); 
       R[i + j+1] = (byte)(sum & MASK); 
       n = (byte)((uint)sum >> 8); 
       i--; 
      } while (i >= 0); 
      R[j] = n; 
      j--; 
     } 
     else 
     { 
      R[j] = 0x00; 
      j--; 
     } 
    } while (j >= 0); 

    return 1; 
} 

그것은 나쁜 작동합니다. 그 문제는 비트 단위라고 생각합니다. 당신의 아이디어에 감사드립니다. :)

+0

더 구체적으로 문제를 제기 할 수 있습니까? 어떤 부분이 작동하지 않습니까? –

답변

0

제가 알기로 여러분의 코드는 A와 B를 입력으로 받아서 R로 출력합니다. 당신이 코딩 한 방식대로 작동하지 않습니다. R을 매개 변수로 곱셈 함수의 범위에 전달하고 있습니다. 즉, 일단 함수가 반환 값에 도달하면이 함수에 사용 된 모든 메모리가 해제되고 R이 지워집니다. 또한 C#에서 원래 매개 변수의 복사본을 만들어 함수에서 사용하고 원래 변수를 변경하지 않는 매개 변수 전달을 사용하고 있습니다.

당신은 그것이 해결하거나 참조로 매개 변수를 전달하기 위해 할 수있는 일 :

public static int multiplication(byte[] A, byte[] B, ref byte[] R) 
{ 
... 

또는 당신은 다음과 같이 될 것이다 함수의 의도 반환로 값 반환 할 수

public static byte[] multiplication(byte[] A, byte[] B) 
{ 
byte[] R; // define this and give it the correct size 

// add your code here 

return R; 
} 
+0

배열은 항상 참조로 전달됩니다. 메서드 내부에 새로운 배열을 할당하지 않으려면 ref를 사용하지 않아도됩니다. 그의 코드에서'R = new byte [n];'이 보이지 않는다. – Tseng

+0

나는 전체 코드를 조사하지 않았지만 지금 당장 시도 할 것이다. 함수가 반환 될 때 "참조 형식"조차도 GCed가 될 것이라고 확신합니다. 적어도 C#에서 그렇습니다. –

+0

그래, 그의 배열은 그의 메소드 밖에서 초기화되고 참조됩니다. ** 참조 복사본 ** 만 메서드에 전달되지만 두 참조는 모두 힙의 동일한 배열 객체를 가리 킵니다. .NET의 배열은 힙에 저장되고 힙의 객체는 참조로 저장됩니다. 명확히하기 위해서 :'R [0] = 5;'또한 그의 배열을 바깥 쪽으로 바꾼다. (물론 초기화된다면 그렇지 않으면'NullReferenceException' 또는'IndexOutOfRangeException'을 얻을 것이다.) R = new byte [A.Length];'won 이 경우 참조를 다시 할당하기 때문에 그의 경우에 작업하지 않습니다 (참조는 복사본이 아니라 배열로 전달됩니다). – Tseng