3

在以下 Java 程序中,我无法理解这一行的作用:

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

我了解按位运算符在条件下的作用,但主要有两个数字(十六进制是 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

将按位与与非布尔值一起使用将按位与两个数字的所有位一个接一个。

在这种情况下,数字0x7FFFFFFFL是一个数字的十六进制表示,它是一个 0 位,后跟 31 个 1 位:

01111111111111111111111111111111

通过与整数进行与运算,您可以保留低 31 位(因为 1 和 x = x 对于任何 x)并清除最高位(因为 0 和 x = 0 对于任何 x)。由于 Java 使用32 位有符号二进制补码表示,这具有清除符号位的效果,强制数字为正数。

我的猜测是,这个程序正在使用某种滚动哈希函数,结果数字必须是正数。为此,代码通过将整数与越来越多的信息相结合来不断更新整数,并在每一步通过清除符号位来强制数字为正数。

希望这可以帮助!

于 2012-12-27T21:47:52.360 回答
2

Anding 与 0x7FFFFFFFL 导致仅包含 31 个最低位,其他位设置为 0。结果始终为正,因为符号位被屏蔽掉了。

于 2012-12-27T21:47:17.460 回答
1

int temp = zahlen[49 - i]; // 线程“main”中的异常 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 回答