按位AND与非布尔值

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特定的问题,那还是很好的:有什么意义得到变量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);
}
Run Code Online (Sandbox Code Playgroud)

tem*_*def 6

使用按位AND与非布尔值将逐个按位并将两个数字中的所有位逐一对齐.

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

01111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

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

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

希望这可以帮助!