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;
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;
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)
@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
@ 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
Làm thế nào để bạn kích hoạt Walk? Kể từ X | 0 == X – Unikorn
my.emask &= ~(ENABLE_SHOOT);
để xóa một vài cờ:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
Đ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.
+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). –
@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
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