在下面的Java程序中,我无法理解这一行:
wert = (wert * mult + inkr) & 0x7FFFFFFFL;
我理解bitwise运算符在条件中的作用,但主要有两个数字(十六进制是Java中Integers的最大值)。我不明白,为什么& 0x7FFFFFFFL; 在这一行中甚至有一些影响。在我看来,变量 wert 应该只有(wert * mult + inkr)的值,因为它是真的。 虽然我发现& 0x7FFFFFFFL; 只有在(wert * mult + inkr)为负时才会产生一些影响。为什么以及在这一行中究竟发生了什么?
注释:这应该是用于模拟彩票抽奖的程序。我知道程序中的错误,评论的位置。但这对我来说现在并不重要。 如果有人能告诉我不是特定于Java的问题,那将会很棒:变量 mult 和 inkr 有什么意义?
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);
}
答案 0 :(得分:6)
对非布尔值使用按位AND将逐个按位对两个数字中的所有位进行逐位运算。
在这种情况下,数字0x7FFFFFFFL
是一个数字的十六进制表示,该数字是0位,后跟31 1位:
01111111111111111111111111111111
通过对整数进行“与”运算,可以保留低31位(因为任何x都是1&amp; x = x)并清除最高位(因为任何x都为0&amp; x = 0)。由于Java使用 32-bit signed two's-complement representation ,因此具有清除符号位的效果,强制数字为正。
我的猜测是这个程序正在使用某种滚动哈希函数,其结果数必须是正数。为此,代码通过将整数与越来越多的信息相结合来不断更新整数,并且在每个步骤中通过清除符号位强制数字为正。
希望这有帮助!
答案 1 :(得分:2)
使用0x7FFFFFFFL导致只包含31个最低位,其他位设置为0.结果始终为正,因为符号位被屏蔽掉。
答案 2 :(得分: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]
将始终抛出异常。有你的例外。