在我的计算机科学课上,我得到了一个算法来乘以两个相同长度的二进制数。我被指示将它转换为乘以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]
。
我不知道我错过了什么或我哪里出错了。任何建议或指示都会有所帮助!
答案 0 :(得分:1)
提示:尝试将[79, 151,33, 197]
和[235, 50, 164, 248]
与您的代码相乘,并将结果与目标结果进行比较。
我相信现在是时候了解endianness了。通常,您的实现看起来没问题,但您使用的示例中的字节顺序不同。一旦你解决它,我认为你会得到正确答案。
P.S。我认为没有充分的理由在您的数组中使用Byte
而不是byte
。这是你可能应该了解的另一个棘手的差异。