【问题标题】:Doubts with the Java operators对 Java 运算符的怀疑
【发布时间】:2012-01-04 19:56:52
【问题描述】:

我正在查看一些 GWT 类的代码,但遗憾的是,我无法理解这部分代码:

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

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

我不太了解java运算符,所以,我的问题是:

究竟发生了什么:

a)getCurrentFace().getFaceID() ^ HOVERING_ATTRIBUTE

b)newFaceID &= ~DISABLED_ATTRIBUTE;

& 是按位与,^ 是按位异或运算符。这就是我所知道的一切。但是,我不明白~DISABLED_ATTRIBUTE 以及在评估值时会发生什么。

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

提前致谢。

【问题讨论】:

标签: java operators bit-manipulation


【解决方案1】:

带有^ 的行正在切换HOVERING_ATTRIBUTE 代表的位。如果该位为 1,则为 0;如果该位为 0,则为 1。

带有&= ~ 的行正在清除DISABLED_ATTRIBUTE 所代表的位。不管之前那个位的值是多少,现在这个位都是0。

~这个东西单独将DISABLED_ATTRIBUTE的所有位反转,所以结果就是我们所说的适合ANDing的位掩码:DISABLED_ATTRIBUTE代表的位变为0,所有其他位变为1 . 所以,如果你与这个掩码的任何值,结果是这个位将被清除,所有其他位将保持不受影响。

【讨论】:

    【解决方案2】:

    ID 中必须有一个为悬停状态保留的位。表达式getCurrentFace().getFaceID() ^ HOVERING_ATTRIBUTE 似乎切换当前面部的悬停属性。换句话说,如果HOVERING_ATTRIBUTE 位为1,则将其设置为零;如果为零,则设置为一。

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

    【讨论】:

    • 你的回答比较完整和容易理解,所以我接受了。其他答案也很有帮助。谢谢大家。
    【解决方案3】:

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

    总体而言,b) 中的操作是将DISABLED_ATTRIBUTEnewFaceID 进行“与”运算,然后将其分配给newFaceID(这是一个屏蔽操作)。

    【讨论】:

      【解决方案4】:

      ~ 是按位的NOT

      它将反转DISABLED_ATTRIBUTE的每个位。

      【讨论】:

        【解决方案5】:

        这是很好的老式 C 样式位掩码。 FaceID 整数存储了一组表示所选布尔属性的位。

        例如HOVERING_ATTRIBUTE 为 2,DISABLED_ATTRIBUTE 为 4。

        通过运行按位异或 (^) 和按位非 (~),可以设置或取消设置这两个位,同时保持其他位不变。

        【讨论】: