XOR 用于比较随机 class 中的多头?

XOR being used to compare longs in Random class?

我使用 IntelliJ IDEA 反编译了 Random class,我发现了这一行:

public Random() {
    this(seedUniquifier() ^ System.nanoTime());
}

我很困惑,因为我认为 ^ 符号是一个只比较两个 boolean 值的 XOR。 seedUniquifier()System.nanoTime() 这两种方法都是 return long 值。

private static long seedUniquifier() {
    long var0;
    long var2;
    do {
        var0 = seedUniquifier.get();
        var2 = var0 * 181783497276652981L;
    } while(!seedUniquifier.compareAndSet(var0, var2));

    return var2;
}

Java 中的 ^ (XOR) 运算符适用于两个 boolean、两个 int 或两个 long,给出结果返回相同的类型。

我假设您知道 XOR 如何对两个布尔值进行异或运算,这两个布尔值可以是真也可以是假。

当 XOR 应用于两个整数时,XOR 将分别应用于每个位。例如:

0xC5 = 1 1 0 0 0 1 0 1
0xF9 = 1 1 1 1 1 0 0 1
---------------------- XOR
0x3C = 0 0 1 1 1 1 0 0

^,就像&|一样,不仅是Java中的布尔运算符,而且是整数按位运算符,如您在Java Language Specification, §15.22.1.

^ 运算符不完全是异或 (XOR)。它是按位异或。借用 this related answer on SO,考虑 0011 ^ 0100。如果我们执行按位异或,我们得到:

  • 1 异或 1 = 0
  • 1 异或 0 = 1
  • 0 异或 1 = 1
  • 0 异或 0 = 0

因此,0011 和 0101 的按位异或等于 0110。

^ 的结果采用与输入相同的类型。两个布尔值的按位异或结果是一个布尔值,两个长整型结果是一个长整型,等等。

尽量不要将 ^ 视为布尔值的不同行为。布尔值实际上只是一位(开或关),因此按位异或结果为一位。唯一的区别是输出的类型。