解释方法 (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 位将是旋转前在字的高端设置的那些位。
看起来是个简单的方法,但我不明白|
是如何工作的:
/**
* 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 位将是旋转前在字的高端设置的那些位。