我正在使用位標誌從一個字節讀取用戶提供的選項。我想檢查該字節是否包含任何無效/未知標誌值。測試無效位標誌
至今我所編寫的快速測試代碼如下所示:
public class Test {
static byte flag1 = 0x01;
static byte flag2 = 0x02;
static byte flag3 = 0x04;
public static void main(String[] args) {
byte invalidFlags = 0x0F;
byte goodFlags = (byte) (flag1 | flag2);
System.out.println(flagsAreOK(invalidFlags));
System.out.println(flagsAreOK(goodFlags));
// prints:
//
// false
// true
}
private static boolean flagsAreOK(byte value) {
byte allFlags = (byte) (flag1 | flag2 | flag3);
byte badFlags = (byte) ~allFlags;
return ((value & badFlags) == 0);
}
}
這似乎工作確定。然而,有誰知道:
一個更好的方法來做到這一點?無論如何,我都不是一個操縱專家的人。
處理標誌操作的現有庫?我已經從Apache Commons Lang找到
BitField
,但是已經有一個抱怨impossible the JavaDocs are to read的錯誤。
您的標誌是否代表一組常量。如果是這樣,你可以利用Java的'EnumSet'和'Enum',這爲你節省了大量的位字段工作。 [Effective Java 2nd]中有一個非常好的提示(http://dhruba.name/2008/12/31/effective-java-item-32-use-enumset-instead-of-bit-fields/)。 – Genzer
它已經很整齊了。使用'int'來保存標誌將刪除這些轉換。 – harold
我看到你的代碼正確。 但是如果你不想計算0x1,0x2,0x4,你可以做「flag1 = 1 << 0」(1),「flag2 = 1 << 1」(2),「flag3 = 1 << 2 「(4)。 如果你的旗幟沒有空白,可以檢查所有沒有或全部,「allFlags =((flag3 << 1) - 1)」 – ggrandes