Làm cách nào để xóa cờ trong C?


Câu trả lời:


339

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)

@Aaron: Tôi rất vui vì nó đã giúp. Ban đầu tôi gặp khó khăn khi hiểu các thao tác 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ẽ hoạt động để xóa cờ đã được đặt. notification.sound ^= Notification.DEFAULT_SOUND;
likejudo

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

Như @Unikorn chỉ ra, giá trị cờ bằng 0 không hoạt động chính xác, nếu bạn cố gắng HOẶC bật hoặc nếu bạn cố gắng VÀ tắt nó.
RenniePet

Để bật tính năng đi bộ, bạn chỉ cần tắt chức năng chạy (sẽ để bit 1 được đặt thành 0). Đừng nghĩ các cờ ENABLE_ * là số thập phân, nhưng là số nhị phân, bật hoặc tắt. Tuy nhiên, bạn vẫn không thể bật hoặc tắt đi bộ rõ ràng .
Jacob Degeling

82
my.emask &= ~(ENABLE_SHOOT);

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

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

13

Đ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.


5
+1 để bắt trường hợp góc không khó hiểu. Một cách để tránh nó là thay vào đó sử dụng flags -= flags & MY_FLAG;(hoặc ^=nếu bạn thích).
R .. GitHub DỪNG GIÚP ICE

1
@R .. Tôi đã sử dụng '^ =' ngoại trừ việc nó sẽ chuyển các bit và đôi khi bạn có thể không biết cờ nào trong số nhiều cờ được đặt. Nếu tôi muốn đảm bảo hai bit bên phải hầu hết bằng 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.