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。
^
的结果采用与输入相同的类型。两个布尔值的按位异或结果是一个布尔值,两个长整型结果是一个长整型,等等。
尽量不要将 ^
视为布尔值的不同行为。布尔值实际上只是一位(开或关),因此按位异或结果为一位。唯一的区别是输出的类型。
我使用 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。
^
的结果采用与输入相同的类型。两个布尔值的按位异或结果是一个布尔值,两个长整型结果是一个长整型,等等。
尽量不要将 ^
视为布尔值的不同行为。布尔值实际上只是一位(开或关),因此按位异或结果为一位。唯一的区别是输出的类型。