2012-01-04 187 views
3

我一直在寻找一些GWT类的一些代码,并且,可耻,我无法理解这部分代码:怀疑与Java运营商

private void toggleHover() { 
    // Toggle hovering. 
    int newFaceID = getCurrentFace().getFaceID()^HOVERING_ATTRIBUTE; 

    // Remove disabled. 
    newFaceID &= ~DISABLED_ATTRIBUTE; 
    setCurrentFace(newFaceID); 
    } 

我不很清楚java的运营商,所以我的问题是:

究竟发生在:

一)getCurrentFace().getFaceID()^HOVERING_ATTRIBUTE

b)newFaceID &= ~DISABLED_ATTRIBUTE;

&是一个按位AND,^是一个按位异或运算符。这就是我所知道的。但是,我不明白~DISABLED_ATTRIBUTE和价值的assings发生了什么。

这段代码来自GWT com.google.gwt.user.client.ui.CustomButton类。

在此先感谢。

+0

'〜'是一个一元位运算符。 – BenCole 2012-01-04 19:59:07

+1

你曾经学习过哪些教程学习位运算符? – 2012-01-04 19:59:21

+1

可能的重复[在Java中按位运算的良好教程](http://stackoverflow.com/questions/1956160/good-tutorials-on-bitwise-operations-in-java) – 2012-01-04 20:01:37

回答

2

在为悬停状态保留的ID中必须有一点。表达式getCurrentFace().getFaceID()^HOVERING_ATTRIBUTE显示为toggle当前面部的悬停属性。换句话说,如果HOVERING_ATTRIBUTE位是1,则它被设置为零;如果它为零,则设置为1。

另一位必须是禁用状态。表达式newFaceID &= ~DISABLED_ATTRIBUTE清除这一位。也就是说,DISABLED_ATTRIBUTE位设置为零。

+0

您的答案有点更完整,容易理解,所以我接受了它。其他答案也有帮助。谢谢大家。 – caarlos0 2012-01-04 21:44:27

3

^的行正在切换HOVERING_ATTRIBUTE代表的位。如果该位为1,则它为0;如果该位为0,则使其为1.

带有&= ~的行将清除DISABLED_ATTRIBUTE表示的位。不管该位在前的值是多少,该位现在为0.

~ thingie单独反转DISABLED_ATTRIBUTE的所有位,所以结果就是我们所说的适用于ANDing的位掩码:那么DISABLED_ATTRIBUTE代表的值变为0,所有其他位变为1.所以,如果你使用这个掩码和任何值,结果是该位将被清除,而所有其他位将不受影响。

1

~是Java中的一个按位NOT运算符。

总而言之,b)中的操作是取DISABLED_ATTRIBUTE的NOT,并将其与newFaceID相加,并将其分配给newFaceID(这是一个掩蔽操作)。

1

~是按位NOT

它将反转DISABLED_ATTRIBUTE的每个位。

1

这是一个很好的旧C式掩码。 FaceID整数存储一组代表所选布尔属性的位。

E.g. HOVERING_ATTRIBUTE是2,DISABLED_ATTRIBUTE是4.

通过运行按位异或(^)和按位不是(〜),可以设置或取消设置这两个位,同时保持其他位完好无损。