解释方法 (x << n) | (x >>> (32 - n))

Explaining method (x << n) | (x >>> (32 - n))

看起来是个简单的方法,但我不明白|是如何工作的:

/**
 * Bitwise rotate a 32-bit number to the left.
 */
private static int rotateLeft(int x, int n) {

    return (x << n) | (x >>> (32 - n));
}

第一部分(x << n),其中<<是二进制左移运算符。左操作数 x 值向左移动右操作数 n.

指定的位数

(x >>> (32 - n)) 部分,其中 >>> 是右移零填充运算符。左操作数 x 值向右移动由右操作数 (32 - n) 指定的位数,移位后的值用零填充。

但是|的目的是什么?

编辑: OK,我发现是简单的运算符:"binary OR operator copies a bit if it exists in either operand"。所以序列是:(x << n),然后是 (x >>> (32 - n)),然后是 (left part result) | (right part result)?

|是按位或运算。

它通常类似于加号运算符,因为它的真值 table 是:

A  B   A|B
-----------
0  0   0
1  0   1
0  1   1
1  1   1

例如:8 | 2 = 10 因为 8 是 1000 而 2 是 0010 所以:

1000 = 8
0010 = 2
----
1010 = 10

A 按位循环 操作将位向左移动,而且 "rescues" 位从值的高端移出并将它们移到低端。该函数中的 | 操作结合了字高端的 "lost" 位——向下移动到低端——其余位向上移动。

向上移位在低端留下 0 位,因此可以确保只有 1 位将是旋转前在字的高端设置的那些位。