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 làm thế nào để loại bỏ nó.
Đâ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 làm thế nào để loại bỏ nó.
Đây là cách tôi đặt cờ.
my.emask |= ENABLE_SHOOT;
Câu trả lời:
Câu trả lời ngắn
Bạn muốn thực hiện thao tác Bitwise AND trên giá trị hiện tại với thao tác Bitwise KHÔNG của cờ bạn muốn hủy đặt . Một bitwise KHÔNG đảo ngược mọi bit (tức là 0 => 1, 1 => 0).
flags = flags & ~MASK;
hoặc flags &= ~MASK;
.
Câu trả lời dà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 Bitwise VÀ với Bitwise KHÔNG về giá trị bạn muốn bỏ đặt.
value = value & ~ENABLE_SHOOT // 00000001
bạn đang thực sự làm:
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)
notification.sound ^= Notification.DEFAULT_SOUND;
my.emask &= ~(ENABLE_SHOOT);
để xóa một vài lá cờ:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
Điều quan trọng cần lưu ý là nếu biến bị thao túng lớn hơn int, thì giá trị được sử dụng trong biểu thức 'và không' cũng phải như vậy. Trên thực tế, đôi khi người ta có thể tránh xa việc sử dụng các loại nhỏ hơn, nhưng có đủ các trường hợp kỳ lạ có lẽ tốt nhất là sử dụng hậu tố loại để đảm bảo các hằng số đủ lớn.
flags -= flags & MY_FLAG;
(hoặc ^=
nếu bạn thích).