2009-02-09 43 views
22

Tôi có bốn lá cờSử dụng toán tử Bitwise trên cờ

Current = 0x1 
Past = 0x2 
Future = 0x4 
All = 0x7 

Nói rằng tôi nhận được hai lá cờ trong quá khứ và tương lai (setFlags(PAST | FUTURE)). Làm thế nào tôi có thể biết liệu Past có ở trong đó không? Tương tự như vậy làm thế nào tôi có thể nói rằng Current không có trong nó? Bằng cách đó tôi không phải thử nghiệm cho mọi sự kết hợp có thể.

Trả lời

40

Nếu bạn muốn tất cả các bit trong mặt nạ kiểm tra để phù hợp:

if((value & mask) == mask) {...} 

Nếu bạn muốn bất kỳ bit nào trong mặt nạ thử nghiệm để đối sánh:

if((value & mask) != 0) {...} 

Sự khác biệt rõ ràng nhất khi bạn kiểm tra giá trị cho nhiều thứ.

Để kiểm tra để loại trừ:

if ((value & mask) == 0) { } 
+0

Bạn sẽ đưa ra một ví dụ với ~? – Malfist

+0

Thực ra, có thể không cần thiết - updatd –

-1

bạn có thể sử dụng VÀ trên đó và kiểm tra xem kết quả có giống như bạn và với không?

4
if ((flags & PAST) == PAST) 
{ 
    // PAST is there 
} 

if ((flags & CURRENT) != CURRENT) 
{ 
    // CURRENT is not there 
} 
+0

Một sự xấu hổ đó là sai (không biên dịch) ...trong C# bạn cần dấu ngoặc xung quanh (flags & CURRENT) –

+4

@Marc Gravell, tại sao bạn lại đăng bình luận này và không sửa bài viết cho anh chàng? – mmcdole

0
(value & Current) == Current 
26

Trước hết - sử dụng enums với FlagAttribute. Đó là những gì nó cho.

[Flags] 
public enum Time 
{ 
    None = 0 
    Current = 1, 
    Past = 2, 
    Future = 4 
    All = 7 
} 

kiểm tra sau đó được thực hiện như thế này:

if ((x & Time.Past) != 0) 

Hoặc này:

if ((x & Time.Past) == Time.Past) 

Sau đó sẽ làm việc tốt hơn nếu "quá khứ" là sự kết hợp của cờ và bạn muốn kiểm tra khu mua sắm.

Setting là như thế này:

x |= Time.Past; 

unset là như thế này:

x &= ~Time.Past; 
+0

Đúng nếu tôi sai, tôi nghĩ 1 không thích hợp để được sử dụng làm giá trị cờ? Như bất kỳ giá trị cờ nào (& Toán tử) với 1, kết quả vẫn là 1. – Roylee

+1

@Roylee - không, đó là một giá trị cờ hoàn toàn bình thường. Nó tương ứng với chính xác một chút. Và suy nghĩ về nó - ví dụ 4 & 1 = 0. –

+0

Icic. đã nhận nó :) Sau đó, bạn có để đảm bảo phần còn lại của bộ giá trị cờ là * sức mạnh của 2 *, phải không? – Roylee

9

Bạn cũng có thể muốn thêm một phương pháp mở rộng như thế này

enum states { 
    Current = 0x1, 
    Past = 0x2, 
    Future = 0x4, 
    All = 0x7 
    }; 

    static bool Is(this states current, states value) { 
    return (current & value) == value; 
    } 

sau đó bạn có thể làm:

if(state.Is(states.Past)) { 
    // Past 
} 
0

Một phụ lục đến Marc Gravell và Vilx -...

Enum được gắn cờ của bạn không được chỉ định số tiền cho "Tất cả", nó chỉ bao gồm các giá trị hiện tại của bạn. Điều này cho tất cả các giá trị được tính toán.

[Flags] 
public enum Time 
{ 
    None = 0, 
    Current = 1, 
    Past = 2, 
    Future = 4, 
    All = Current | Past | Future 
} 

Lưu ý rằng Vilx- đã xóa sử dụng hệ thập lục phân cho giá trị. Điều này là quan trọng bởi vì một khi bạn đã qua 0x8, các giá trị của bạn sẽ phải tuân thủ Hex. Bạn chỉ nên ở dạng thập phân.

Các vấn đề liên quan