2011-09-29 27 views
17

Xin chào, tôi cần xóa cờ trong Java. Tôi có hằng số sau:Cách xóa cờ trong Java

public final static int OPTION_A = 0x0001; 
public final static int OPTION_B = 0x0002; 
public final static int OPTION_C = 0x0004; 
public final static int OPTION_D = 0x0008; 
public final static int OPTION_E = 0x0010; 
public final static int DEFAULT_OPTIONS = 
     OPTION_A | OPTION_B | OPTION_C | OPTION_D | OPTION_E; 

Tôi muốn loại bỏ, ví dụ OPTION_E từ tùy chọn mặc định. Tại sao mã sau không đúng?

// remove option E from defaul options: 
int result = DEFATUL_OPTIONS; 
result |= ~OPTION_E; 
+0

JVM cho bạn biết điều gì? Sẽ không chạy nó nhanh hơn chờ đợi một câu trả lời để trở lại từ SO? Bạn có thể đã thực hiện điều này ba lần ngay bây giờ. – duffymo

Trả lời

36

|= Thực hiện một bitwise hoặc, vì vậy bạn có hiệu quả "thêm" tất cả các cờ khác với số OPTION_E. Bạn muốn &= (Bitwise ) để nói rằng bạn muốn giữ tất cả các lá cờ khác hơn OPTION_E:

result &= ~OPTION_E; 

Tuy nhiên, một cách tiếp cận tốt hơn sẽ được sử dụng enums và EnumSet để bắt đầu với:

EnumSet<Option> options = EnumSet.of(Option.A, Option.B, Option.C, 
            Option.D, Option.E); 
options.Remove(Option.E); 
+4

+1 để đề xuất sử dụng EnumSet. –

+0

Nó có tôi liệt kê như là downvoting này. Tôi nghĩ đó là một sai lầm, và đã quá lâu rồi nên bây giờ tôi không thể hoàn tác nó! – Andy

+0

EnumSet rất chi tiết so với các thao tác bitwise. Lợi ích của EnumSet khiến bạn tin rằng đó là cách tiếp cận tốt hơn? – RestInPeace

8

Bạn phải viết giải thích

result &= ~OPTION_E; 

dài:

Bạn phải nghĩ theo bit:

~OPTION_E // 0x0010 -> 0xFFEF 
DEFATUL_OPTIONS //  -> 0x001F 
0xFFEF | 0x001F //  -> 0xFFFF 
0XFFEF & 0x001F //  -> 0x000F 

Các OR sẽ không bao giờ rõ ràng 1 bit, nó sẽ ở hầu hết các thiết lập một số chi tiết. AND mặt khác sẽ xóa các bit.

5

Bạn nên sử dụng các nhà điều hành and thay vì or:

result &= ~OPTION_E; 

Một cách để suy nghĩ về nó là |=bộ bit trong khi &=xóa bit:

result |= 1; // set the least-significant bit 
result &= ~1; // clear the least-significant bit