单字节比较而不是多个布尔比较

时间:2015-08-24 06:47:52

标签: java

我有类A和类B.类A在文本挖掘期间设置类B的各种标志(布尔变量)。在最后一步中,B类决定这些标志的不同组合。大约有10个布尔变量(将来可能会增加)。

我想知道我是否使用单字节比较而不是多个布尔比较。因此,我不必维护大的布尔变量列表,也可以避免多重比较。

我在设置值或比较时尝试使用按位运算符 例如:

if(byteFlag == xb001010)

if((byteFlag ^ xb0000011) == xb0000011)

* plz忽略上面给出的原始代码,这只是一个粗略的例子。

但是我最终得到了糟糕的代码,甚至还没有给我带来任何性能提升。

如果有人在之前使用字节比较而不是多重比较,或者如何更好地执行此操作,请建议我。

3 个答案:

答案 0 :(得分:0)

我赞同评论中提到的BitSet选项,它可能会使您的代码更清晰。如果您想尝试按位操作并批量比较标记,可以使用|(按位or)来设置标记。 您可以将它们比作int(甚至是64位处理中的long):

public static final int FLAG_1 = 1;
public static final int FLAG_2 = 1 << 1;
public static final int FLAG_3 = 1 << 2;
//etc..
private int flags = 0;

public void setFlag(int flag){
    flags = flags | flag; // use bitwise 'or'
}
public boolean compareFlags(int otherFlags){
    return flags == otherFlags;
}

答案 1 :(得分:0)

考虑使用enum来指示文本可以拥有的每个属性,并存储EnumSet中存在的属性集。 EnumSet会让你为你建议的那种麻烦。

答案 2 :(得分:0)

你可以做两件事:

- 使用Bool的代数减少你的表达

- 使用二元掩码

例如

    int b1=(true)? 0: 1; //Set your real condition instead of true
    int b2=(true)? 0: 2;
    int b3=(true)? 0: 4;
    int b4=(true)? 0: 8;



    // for example if you want to have b1 and b2 true and to test it
    int argument=7;
    boolean example = (argument |b1+b2) ==b1+b2;