Java<<运算符(在这段代码中)

时间:2013-12-10 07:21:56

标签: java android

所以我正在阅读ViewGroups上this Android页面的示例源代码, 我遇到了这些问题:

// Report our final dimensions.
setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
        resolveSizeAndState(maxHeight, heightMeasureSpec,
                childState << MEASURED_HEIGHT_STATE_SHIFT));

所以我希望学习:

  1. &lt;&lt;&lt;&lt;&lt;&lt;运算符完全用Java做什么?

  2. 上述代码段的最后一行发生了什么?

  3. 感谢。

5 个答案:

答案 0 :(得分:4)

它不是操作数,而是操作员。确切地说是bit-wise shift operator

xy作为操作数,x << yxy位的位移到左侧。它基本上与2乘以幂y相同。

答案 1 :(得分:2)

&LT;&LT;是一个位移操作员。

对于一件事我们使用单个32位int的高16位而另一件事使用低16位这是非常的。

childState&lt;&lt; MEASURED_HEIGHT_STATE_SHIFT表示childState正在传递一个高度(低16位),该高度期望在int的高16位传递给resolveSizeAndState()。

答案 2 :(得分:1)

这是按位和位移算子。更多信息可以在http://docs.oracle.com/javase/tutorial/java/nutsandbolts/opsummary.html

找到

对于Ex:

1111 1110 << 2 
1111 1000  // Have added 0 from right

0001 1111 >> 3 
0000 0011 // Will preserve MSB and shift it right

如果你不想保留第一位,你可以使用(在Java,Scala,C ++,C afaik,甚至更多)三重符号运算符:

1100 1100 >>> 1
0110 0110 

答案 3 :(得分:1)

“&LT;&LT;”有点算子。

我引用tutorial对Java的解释

  

签名左移运算符“&lt;&lt;”将位模式向左移位,并使用带符号的右移运算符“&gt;&gt;”将位模式向右移动。

我还引用here

中的一个例子
int a = 60;     /* 60 = 0011 1100 */
int c = 0;
c = a << 2;     /* 240 = 1111 0000 */

所以你可以看到一个&lt;&lt; n 几乎 a *(2 ^ n)

答案 4 :(得分:1)

  1. &lt;&lt;&lt;&lt;&lt;&lt;运营商到底在Java做什么? 它向左移动位。如前面的答案所述:

    1111 1110&lt;&lt; 2 1111 1000 //从右侧添加0

  2. 上述代码段的最后一行发生了什么?     代码正在改变状态。它有时用来代表国家。 e.g。

    state1 = 1 << 0;
    state2 = 1 << 1; 
    state3 = 1 << 2;
    

    所以你有3个独特的状态。