3

次の Java プログラムでは、この行が何をするのか理解できません。

wert = (wert * mult + inkr) & 0x7FFFFFFFL;

ビット単位の演算子が条件で何をするかは理解していますが、主に 2 つの数値があります (16 進数は Java の整数の最大値です)。& 0x7FFFFFFFL;の理由がわかりません。は、この行にいくらかの影響さえあります。私の意見では、変数wertは単純に(wert * mult + inkr)の値を持つべきです。これは正しいからです。私は& 0x7FFFFFFFL;を理解しましたが。(wert * mult + inkr)が負の場合にのみ、明らかに何らかの影響があります。なぜ、そしてこの行で正確に何が起こるのでしょうか?

注釈: これは、宝くじの抽選をシミュレートするためのプログラムである必要があります。コメントがある場所で、プログラムのエラーを認識しています。しかし、これは今の私には関係ありません。それでも、実際には Java 固有ではない質問に従って、誰かが教えてくれれば素晴らしいことです: 変数multinkrはどのような意味を持つのでしょうか?

public static void main(String args[]) {
    int kugeln = 49;
    int ziehen = 6;
    int mult = 1103515245;
    int inkr = 12345;
    long wert = System.currentTimeMillis();
    int zahlen[] = new int[kugeln];

    for(int i = 0; i < kugeln; i++) {
        zahlen[i] = i + 1;
        wert = (wert * mult + inkr) & 0x7FFFFFFFL;
    }

    for(int i = 0; i < ziehen; i++) {
        int index = (int)(wert / 10) % (49 - i);
        int temp = zahlen[49 - i]; // Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 49
        zahlen[49 - i] = zahlen[index];
        zahlen[index] = temp;
        wert = (wert * mult + inkr) & 0x7FFFFFFFL;
    }

    int superzahl = (int)(wert / 10) % 10;
    for(int i = 0; i < ziehen; i++) {
        System.out.println(zahlen[49 - i]);
    }

    System.out.println(superzahl);
}
4

3 に答える 3

6

非ブール値でビット単位の AND を使用すると、2 つの数値のすべてのビットが 1 つずつビット単位の AND になります。

この場合、数値0x7FFFFFFFLは、0 ビットの後に 31 ビットの 1 ビットが続く数値の 16 進数表現です。

01111111111111111111111111111111

これを整数と AND することにより、下位 31 ビットを保持し (任意の x に対して 1 & x = x であるため)、最上位ビットをクリアします (任意の x に対して 0 & x = 0 であるため)。Java は32 ビットの符号付き 2 の補数表現を使用するため、これは符号ビットをクリアして数値を強制的に正にする効果があります。

私の推測では、このプログラムは、結果の数値が正でなければならない何らかのローリング ハッシュ関数を使用していると思われます。これを行うために、コードは整数をより多くの情報と組み合わせて常に更新し、各ステップで符号ビットをクリアして数値を強制的に正にします。

お役に立てれば!

于 2012-12-27T21:47:52.360 に答える
2

0x7FFFFFFFL を使用すると、下位 31 ビットのみが含まれ、その他は 0 に設定されます。符号ビットがマスクされるため、結果は常に正になります。

于 2012-12-27T21:47:17.460 に答える
1

int temp = zahlen[49 - i]; // スレッド「メイン」での例外 java.lang.ArrayIndexOutOfBoundsException: 49

iから始まる0のでzahlen[49 ]

 int zahlen[] = new int[kugeln];



int kugeln = 49;



int a[] = new int [49];

a[49]常に例外をスローします。あなたの例外があります。

于 2012-12-27T21:50:41.600 に答える