我可以简化这个吗? (字节为1位的Xor)

时间:2012-06-21 12:03:54

标签: java binary set clear bit

可以简化这个吗?

    public void setDisabled(boolean disabled) {
    if(disabled)
        this._rflags |= 1 << B1;
    else
        this._rflags &= ~(1 << B1);
}

设置1位字节(B1 = 2)

-edit -

我错过的重要信息

private char _rflags;

public static final char B1 = 1 << 2;

我想将它保留为char并将单个或多个位作为不同类型访问,因为数据来自带有联合的C结构。我也将通过UDP发回这些数据。

4 个答案:

答案 0 :(得分:0)

您可能会看到一些巧妙的方法来重构您的方法。我会提供一些不同的答案。它可能适用于您的案件,也可能不适用;我没有太多的背景。

一种方法是使用Factory返回类的实例。如果&#39;是&#39;传递到Factory,返回包含此方法的类:

public void setDisabled() {
        _rflags &= ~(1 << B1);
}

如果&#39; false&#39;传入后,工厂返回的类将是执行其他计算的单行程序。注意缺乏一个论点;因为决定已经做出,所以不需要它。关于访问_rflags的Squint;我没有&#39;知道课程的样子。也许_rflags将传递给此方法。

在一个更美丽的世界中,包含setDisabled(boolean)方法的整个类将由工厂返回。然后,任何检查残疾人旗帜的案件都可以由工厂抽出。

答案 1 :(得分:0)

在Java中缩短它是没有真正的整洁方法。如果你要重复它,我会说坚持DRY原则并把它放在另一种方法中。

public void setDisabled(final boolean disabled) {
    toggleFlag(B1, disabled);
}

private void toggleFlag(final int bit, final boolean on) {
    if (on)
        this._rflags |= 1 << bit;
    else
        this._rflags &= ~(1 << bit);
}

答案 2 :(得分:0)

正式简化:在签名中将 void 更改为 Object (从未使用过):

 return disabled == true ? this._rflags |= 1 << B1 :  this._rflags &= ~(1 << B1);

答案 3 :(得分:0)

主要问题是将布尔值转换为int。如果不在java中使用某种条件运算符/ if-else,就无法表达这一点。

有很多方法可以用一种看似聪明的方式来做到这一点,但恕我直言最好坚持一个很容易被大多数人理解的变体(你已经拥有的if-else方法)。

你可以把它写得更紧凑,但它仍然是一团糟:

final static int B1 = 2;

public void setDisabled(final boolean disabled) {
     final int bitmask = disabled ? (1 << B1) : 0;
     _rflags = (_rflags & ~bitmask) | bitmask; 
}

顺便说一下,如果属性名为 enabled ,大多数人可能会发现它更合乎逻辑,并且当选项打开时设置位设置(这就是setEnabled()语义的方式适用于java.awt.Component等。)。