Возможный дубликат:
Как Java обрабатывает целочисленные недополнения и переполнения и как бы вы это проверили?
Умножение двух целых чисел становится отрицательным
Моя программа представляет собой реализацию фильтра Блума. Однако, когда я сохраняю результаты своей хэш-функции в битовом массиве, функция (из form f(i) = (a*i + b) % m
, где a, b, i, m — все положительные целые числа) дает мне отрицательный результат. Проблема, по-видимому, заключается в вычислении a*i, которое оказывается отрицательным.
Игнорируйте операторы печати в коде; те были для отладки. По сути, значение temp в этом блоке кода оказывается отрицательным, поэтому я получаю ArrayOutOfBoundsException
.
m
— длина битового массива, z
— количество используемых хеш-функций, S
— набор значений, которые являются членами этого фильтра Блума, а H
хранит значения a и b для хеш-функций f1, f2,... , фз.
public static int[] makeBitArray(int m, int z, ArrayList<Integer> S, int[] H)
{
int[] C = new int[m];
for (int i = 0; i < z; i++)
{
for (int q = 0; q < S.size() ; q++)
{
System.out.println(H[2*i]);
int temp = S.get(q)*(H[2*i]);
System.out.println(temp);
System.out.println(S.get(q));
System.out.println(H[2*i + 1]);
System.out.println(m);
int t = ((H[2*i]*S.get(q)) + H[2*i + 1])%m;
System.out.println(t);
C[t] = 1;
}
}
return C;
}