Max*_*rev 3 java hex bit-manipulation bitwise-operators bitwise-and
在下面的Java程序中,我无法理解这一行的作用:
wert = (wert * mult + inkr) & 0x7FFFFFFFL;
Run Code Online (Sandbox Code Playgroud)
我理解按位运算符在条件中的作用,但主要有两个数字(十六进制是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);
}
Run Code Online (Sandbox Code Playgroud)
使用按位AND与非布尔值将逐个按位并将两个数字中的所有位逐一对齐.
在这种情况下,数字0x7FFFFFFFL
是一个数字的十六进制表示,该数字是0位,后跟31 1位:
01111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)
通过对整数进行AND运算,可以保留低31位(因为任何x的1和x = x)并清除最高位(因为任何x的0和x = 0).由于Java使用32位带符号二进制补码表示,因此具有清除符号位的效果,强制数字为正数.
我的猜测是这个程序正在使用某种滚动哈希函数,其结果数必须是正数.为此,代码通过将整数与越来越多的信息组合来不断更新整数,并且在每个步骤通过清除符号位强制数字为正.
希望这可以帮助!
归档时间: |
|
查看次数: |
294 次 |
最近记录: |