2015-04-16 70 views
-1

看起来像一个简单的方法,但我不明白如何|在这里工作:解释方法(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)指定的位数,移位后的值用零填充。

但是|的用途是什么?

编辑: 好的,我发现它是简单的运算符:“二进制或运算符复制一个位,如果它存在于任一操作数”。所以顺序是:(x << n),然后(x >>> (32 - n)),然后(left part result) | (right part result)

+0

要结合这两部分? – immibis

+2

这是按位或? –

+1

[Java运营商](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html) – resueman

回答

2

逐位旋转动作转移位到左侧,而且“营救”位移离值的高端,并转移他们到低端。该函数中的|操作组合了来自单词—的高端的“丢失”位向下移位到低端—,其余位向上移位。

向上移动会在低端留下0位,所以可以确保唯一的1位是在旋转前设置在单词高端的那些位。

4

|是按位或运算。

它往往类似于加上运营商,因为它的真值表:

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 
相关问题