这是我的代码 - 它的经典乘法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将被清除。您还使用了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;
}