0

可能重复:
Java 如何处理整数下溢和上溢以及如何检查?
两个 int 的乘法得到否定

我的程序是布隆过滤器的实现。但是,当我将哈希函数结果存储在位数组中时,该函数(form f(i) = (a*i + b) % m其中 a、b、i、m 都是正整数)给了我一个否定的结果。问题似乎在于 a*i 的计算结果为负。

忽略代码中的打印语句;那些是用于调试的。基本上,这段代码中 temp 的值是负数,所以我得到一个ArrayOutOfBoundsException.

m是位数组长度,z是正在使用的散列函数的数量,S是作为布隆过滤器成员的值的集合,并H存储散列函数 f1、f2、...、fz 的 a 和 b 的值。

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;
}
4

2 回答 2

2

取决于数字有多大mz使用long. 如果您需要更大的数字,请考虑诸如BigInteger.

于 2012-09-30T09:36:51.853 回答
0

使用long. (http://en.wikipedia.org/wiki/Integer_overflow

于 2012-09-30T09:36:29.313 回答