字节数组乘法

时间:2014-02-15 11:53:17

标签: c# multiplication

这是我的代码 - 它的经典乘法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;
}

效果不好。我认为这个问题是按位的。 我感谢你的想法。 :)

1 个答案:

答案 0 :(得分:0)

据我所知,你的代码将A和B作为输入并返回R右边的输出?那么你编码它的方式不起作用。您将R作为参数传递给乘法函数的范围。这意味着一旦函数命中一个返回函数,该函数使用的所有内存都将被释放,R将被清除。您还使用了pass by参数,该参数在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;
}