所以我正在阅读ViewGroups上this Android页面的示例源代码, 我遇到了这些问题:
// Report our final dimensions.
setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
resolveSizeAndState(maxHeight, heightMeasureSpec,
childState << MEASURED_HEIGHT_STATE_SHIFT));
所以我希望学习:
&lt;&lt;&lt;&lt;&lt;&lt;运算符完全用Java做什么?
上述代码段的最后一行发生了什么?
感谢。
答案 0 :(得分:4)
它不是操作数,而是操作员。确切地说是bit-wise shift operator。
将x
和y
作为操作数,x << y
将x
值y
位的位移到左侧。它基本上与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)
&lt;&lt;&lt;&lt;&lt;&lt;运营商到底在Java做什么? 它向左移动位。如前面的答案所述:
1111 1110&lt;&lt; 2 1111 1000 //从右侧添加0
上述代码段的最后一行发生了什么? 代码正在改变状态。它有时用来代表国家。 e.g。
state1 = 1 << 0;
state2 = 1 << 1;
state3 = 1 << 2;
所以你有3个独特的状态。