按位AND与非布尔值

时间:2012-12-27 21:44:28

标签: java bit-manipulation bitwise-operators hex bitwise-and

在下面的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);
}

3 个答案:

答案 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

i0开始,因此zahlen[49 ]被称为

 int zahlen[] = new int[kugeln];



int kugeln = 49;



int a[] = new int [49];

a[49]将始终抛出异常。有你的例外。