2010-10-13 20 views
111

Có một biến chứa một số cờ và tôi muốn xóa một trong số chúng. Nhưng tôi không biết cách loại bỏ nó.Làm cách nào để xóa cờ trong C?

Đây là cách tôi đặt cờ.

my.emask |= ENABLE_SHOOT; 
+5

Bạn có thể tìm thấy câu trả lời cho câu hỏi SO ["Cách bạn đặt, xóa và chuyển đổi một bit trong C"] (http://stackoverflow.com/questions/47981/how-do-you-set- clear-and-toggle-a-single-bit-in-c) hữu ích. – schot

Trả lời

266

ngắn trả lời

Bạn muốn làm một hoạt động Bitwise AND trên giá trị hiện tại với một hoạt động Bitwise NOT của cờ bạn muốn bỏ đặt số. Một bitwise KHÔNG đảo ngược từng bit (tức là 0 => 1, 1 => 0).

flags = flags & ~MASK; hoặc flags &= ~MASK;.

dài trả lời

ENABLE_WALK = 0 // 00000000 
ENABLE_RUN = 1 // 00000001 
ENABLE_SHOOT = 2 // 00000010 
ENABLE_SHOOTRUN = 3 // 00000011 

value = ENABLE_RUN  // 00000001 
value |= ENABLE_SHOOT // 00000011 or same as ENABLE_SHOOTRUN 

Khi bạn thực hiện một phép toán AND với Bitwise NOT giá trị bạn muốn unset.

value = value & ~ENABLE_SHOOT // 00000001 

bạn đang thực sự thực hiện:

 0 0 0 0 0 0 1 1  (current value) 
    & 1 1 1 1 1 1 0 1  (~ENABLE_SHOOT) 
     --------------- 
     0 0 0 0 0 0 0 1  (result) 
+0

@Aaron: Tôi rất vui vì nó đã giúp ích. Ban đầu tôi gặp khó khăn khi hiểu các hoạt động bitwise * cho đến khi * ai đó mất 10 phút để giải thích nó trên giấy. – Dennis

+1

@ Dennis Tôi nghĩ XOR sẽ làm việc để loại bỏ một lá cờ đã được thiết lập. 'notification.sound^= Notification.DEFAULT_SOUND;' – likejiujitsu

+3

Làm thế nào để bạn kích hoạt Walk? Kể từ X | 0 == X – Unikorn

69
my.emask &= ~(ENABLE_SHOOT); 

để xóa một vài cờ:

my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE); 
10

Điều quan trọng cần lưu ý là nếu con người biến chế tác lớn hơn một int, giá trị sử dụng trong 'chứ không phải' biểu phải là tốt. Trên thực tế, người ta đôi khi có thể lấy đi bằng cách sử dụng các loại nhỏ hơn, nhưng có đủ trường hợp lẻ có thể là tốt nhất để sử dụng hậu tố loại để đảm bảo các hằng số đủ lớn.

+4

+1 để bắt trường hợp góc không rõ ràng. Một cách để tránh nó là sử dụng 'flags - = flags & MY_FLAG;' (hoặc '^ =' nếu bạn thích). –

+1

@R .. Tôi đã sử dụng '^ =' trừ khi nó sẽ chuyển đổi các bit và đôi khi bạn có thể không biết cờ nào được đặt nhiều. Nếu tôi muốn đảm bảo hai bit phù hợp nhất là 0, ví dụ: my.emask: '0 1 0 1' đầu vào: '0 0 1 1' với: '^ =' '0 1 1 0' với: '& ~' '0 1 0 0' – Hector

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