3

誰もが知っているように、Java には unsigned 型がありません。C# (uint を使用) のスニペットを Java に変換する必要があります。ここに私のコード:

private const int ROLLING_WINDOW = 7;
private const int HASH_PRIME = 0x01000193;
private unit h1, h2, h3, n;
private byte[] window;

//...

private uint roll_hash(byte c)
{
    h2 -= h1;
    h2 += (uint)ROLLING_WINDOW * c;

    h1 += c;
    h1 -= window[n % ROLLING_WINDOW];

    window[n % ROLLING_WINDOW] = c;
    n++;

    h3 = (h3 << 5);
    h3 ^= c;

    return h1 + h2 + h3;
}

private static uint sum_hash(byte c, uint h)
{
        h *= HASH_PRIME;
        h ^= c;
        return h;
}

Javalongでは代わりに使用しますuintが、結果が負の値になることがあります。解決策は、署名されていない演算子を使用しています。いくつかの検索では 0xFFFFFFFFL について表示されますが、締め切りが迫っている間は非常に複雑です。この問題で誰かが私を助けてくれることを願っています。ありがとう

4

2 に答える 2

3

コードはほとんど同じです。%操作のみが異なります。

window[(int)((n & 0xFFFFFFFFL) % ROLLING_WINDOW)]

またはあなたは書くことができます

window[n]

if(++n == ROLLING_WINDOW) n = 0;

さらに詳細に

private int roll_hash(byte c)
{
    h2 -= h1; // same
    h2 += ROLLING_WINDOW * c; // same, remove (uint)

    h1 += c; // same
    h1 -= window[n];

    window[n] = c;
    if(++n == ROLLING_WINDOW) n = 0; // limit n to 0 to 6 so % is not required.

    h3 = (h3 << 5); // same
    h3 ^= c; // same

    return h1 + h2 + h3; // same
}

private static int sum_hash(byte c, int h)
{
        h *= HASH_PRIME; // same
        h ^= c; // same
        return h;
}
于 2012-06-28T15:21:32.773 に答える
0

符号なし整数値を long に変換する場合は、符号拡張ビットをマスクする必要があります。

int uintValue = 0x80706050;
long value = 0x00000000FFFFFFFFL & uintValue;
于 2012-06-28T15:23:18.503 に答える