蛮力基础256乘法

时间:2018-02-18 22:23:49

标签: java arrays math

在我的计算机科学课上,我得到了一个算法来乘以两个相同长度的二进制数。我被指示将它转换为乘以256的基数并用Java实现它,但我似乎无法得到正确的输出而且我不知道我错过了什么。

我给出的算法:

MULTIPLY(U,V)
  define array W[1..2n] for k = 1 to 2n
  W[k] = 0 // Initialize result
  for j=1 to n
    c = 0 // Carry bit
    for i = 1 to n
      t = U[i]V[ j] + W [i+j] + c
      W[i+j] = t mod 2 // lower bit 
      c= /2 // upper bit
    k = i+j
    while k ≤ 2n and c ≠ 0 // propagate carry bit
      t=W[k]+ c
      W[k]=tmod2 // lower bit 
      c=/2 // upper bit 
      k++
  return W

我的尝试:

private static Byte[] bruteMultiply(Byte[] U, Byte[] V) {
    Byte[] W = new Byte[U.length * 2];

    for (int k = 0; k < W.length; k++) {
        W[k] = 0;
    }

    for (int j = 0; j < U.length; j++) {
        int c = 0;

        for (int i = 0; i < U.length; i++) {
            int t = (U[i] & 0xFF) * (V[j] & 0xFF) + (W[i + j] & 0xFF) + c;
            W[i + j] = (byte) (t % 256);
            c = t / 256;
        }
        int k = U.length + j;
        while ((k < 2 * U.length) && (c != 0)) {
            int t = (W[k] & 0xFF) + c;
            W[k] = (byte) (t % 256);
            c = t / 256;
            k++;
        }
    }

    return W;
}

当我向数组[197, 33, 151, 79][248, 164, 50, 235]提供数据时,我会在[216, 234, 132, 91, 206, 122, 31, 73]出现时获得[191, 118, 251, 78, 251, 255, 83, 133]

我不知道我错过了什么或我哪里出错了。任何建议或指示都会有所帮助!

1 个答案:

答案 0 :(得分:1)

提示:尝试将[79, 151,33, 197][235, 50, 164, 248]与您的代码相乘,并将结果与​​目标结果进行比较。

我相信现在是时候了解endianness了。通常,您的实现看起来没问题,但您使用的示例中的字节顺序不同。一旦你解决它,我认为你会得到正确答案。

P.S。我认为没有充分的理由在您的数组中使用Byte而不是byte。这是你可能应该了解的另一个棘手的差异。