按位乘法的这种实现有什么问题?

时间:2016-11-17 16:39:41

标签: java bit-manipulation

我试图在Galois Field 256中实现一种用于逐位乘法的方法,以便构建AES的实现。我目前的乘法方法如下:

public static int multiplyPolynomials(int n, int m)
{
int result = 0x00000000;
String ns = toBitString(n);
String ms = toBitString(m);

for (int i = 0; i < ns.length(); i++)
{
    if (ns.charAt(i) == '1')
    {
        /*
         * If there's a 1 at place i, add the value of m left-shifted i places to the result.
         */
        int temp = m;
        for (int j = 0; j < i; j++) { temp = temp << 1; } 
        result += temp;
    }
}
return result;
}

toBitString(int n)方法纯粹是Integer.toBinaryString(int n)的快捷方式。

给定(0x0000ef00, 2)的输入,此函数的输出为494(应为478)。打印到toBitString(0x0000ef00)的直接调用确认该函数的输出符合预期(在本例中为1110111100000000)。如果第一个输入向右移一个字节(0x000000ef),则输出仍为494.

通过上述输入,ns的值为1110111100000000,而result的位字符串为111101110ns因此是正确的。

上述方法中的错误是什么?

1 个答案:

答案 0 :(得分:4)

你正在以错误的方式阅读二进制字符串。

试试这个......

public static int multiplyPolynomials(int n, int m) {
    int result = 0x00000000;
    String ns = Integer.toBinaryString(n);

    for (int i = 0; i < ns.length(); i++) {
        // Read the string the other way round...
        int bitIndex = (ns.length() - i) - 1;
        if (ns.charAt(bitIndex) == '1') {
            /*
             * If there's a 1 at place i, add the value of m left-shifted i
             * places to the result.
             */
            int temp = m;
            // Don't need a loop here, just shift it by "i" places
            temp = temp << i;
            result += temp;
        }
    }
    return result;
}

不是将数字变成二进制字符串,而是可以使用类似的东西......

public static int multiplyPolynomials(int n, int m) {
    int result = 0x00000000;

    for (int i = 0; i < 32; i++) {
        int mask = 1 << i;

        if ((n & mask) == mask) {
            result += m << i;
        }
    }
    return result;
}

您可能需要将答案存储为长时间以防止溢出,并且对于负数而言可能无法正常工作...