C'deki bir bayrağı nasıl kaldırabilirim?


Yanıtlar:


339

Kısa cevap

Ayarlamak istediğiniz bayrağın Bitwise NOT işlemi ile geçerli değer üzerinde Bitwise AND işlemi yapmak istiyorsunuz . A Bitwise NOT her biti ters çevirir (yani 0 => 1, 1 => 0).

flags = flags & ~MASK;veya flags &= ~MASK;.

Uzun cevap

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

Ayarlanmasını istediğiniz değerin Bitwise VE Bitwise NOT ile gerçekleştirilmesi.

value = value & ~ENABLE_SHOOT // 00000001

aslında yapıyorsun:

      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: Yardımcı olduğuna sevindim. Başlangıçta birisi kağıt üzerinde açıklamak için 10 dakika sürene kadar bitsel işlemleri anlamakta zorlandım .
Dennis

1
@Dennis XOR'un önceden ayarlanmış bir bayrağı kaldırmak için çalışacağını düşündüm. notification.sound ^= Notification.DEFAULT_SOUND;
likejudo

3
Walk'u nasıl etkinleştirirsiniz? X'ten beri | 0 == X
Unikorn

@Unikorn'un işaret ettiği gibi, sıfır işaretli bir bayrak değeri, VEYA çalıştırmaya çalışırsanız veya VEYA kapatmaya çalışırsanız düzgün çalışmaz.
RenniePet

Yürümeyi etkinleştirmek için, çalışmayı devre dışı bırakmanız gerekir (bu, bit 1'i 0'a ayarlanmış olarak bırakır). ENABLE_ * bayraklarını ondalık sayılar olarak değil, açık veya kapalı ikili sayılar olarak düşünün. Yine de yürüyüşü açıkça etkinleştiremez veya devre dışı bırakamazsınız .
Jacob Degeling

82
my.emask &= ~(ENABLE_SHOOT);

birkaç bayrağı silmek için:

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

13

Manipüle edilen değişken bir int'ten büyükse, 'değil' ifadesinde kullanılan değerin de olması gerektiğine dikkat etmek önemlidir. Aslında, bazen daha küçük tipler kullanmaktan kurtulabilir, ancak sabitlerin yeterince büyük olduğundan emin olmak için muhtemelen tür soneklerini kullanmanın en iyi olacağı tuhaf durumlar vardır.


5
Açık olmayan köşe kasasını yakalamak için +1. Bundan kaçınmanın bir yolu kullanmaktır flags -= flags & MY_FLAG;(veya ^=isterseniz).
R .. GitHub BUZA YARDIMCI DURDUR

1
@R .. '^ =' kullanırdım, ancak bitleri değiştirir ve bazen birçok bayraktan hangisinin ayarlandığını bilmiyor olabilirsiniz. En sağdaki iki bitin sıfır olduğundan emin olmak istersem, örneğin my.emask: '0 1 0 1' input: '0 0 1 1' with: '^ =' '0 1 1 0' with: '& ~ '' 0 1 0 0 '
Hector
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.