“(İnt) değer & 0x1, (int) değer & 0x2, (int) değer & 0x4, (int) değer & 0x8” ne anlama geliyor? "


11

kod

"Değer" 0 ila 15 arasındadır (olası değerleri). Bu 4 "if" koşulu ne zaman karşılanacak? (İnt) değerim = 2 ise, bu 0010 anlamına mı geliyor?

            if  ((int)value & 0x1) 
            {
                //statement here
            }
            if  ((int)value & 0x2) 
            {
                //statement here
            }
            if  ((int)value & 0x4) 
            {
                //statement here
            }
            if  ((int)value & 0x8) 
            {
                //statement here
            }

3
Bunlar şunlardır bit maskesi bireysel bit kontrol value(okuma if(value & 0x4)"nin 3. bit mi olarak valuegörünüşte kodu anlamakta problem olarak ayarlanmış (= 1)). Ben senin değil varsayalım. Soran olmadığını bu (ve aslında inceleme) için bu soruyu konu dışı kılan CR.SE .
Kimse

Daha iyi anlamak için, C # 'a taşınan benzer kod, Enum.HasFlagbitleri test etmek için yöntemi kullanır. Bakınız: Enum.HasFlag .
rwong

Yanıtlar:


12

Her sayı, value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...her b ya 0da olduğu gibi ifade edilebilir 1(bunlar temsilin bitleridir). Bu ikili gösterimdir.

İkili AND ( &), bu bçiftlerin her birini akıllıca ve AND üzerinde performans gösterir. Bu aşağıdaki çıktılara sahiptir:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

(Sadece bir biti açık olan) 2 güçlerini kullanarak ayrı bitleri izole edebilir ve test edebiliriz:

  • value & 1valuetuhaf {1, 3, 5, 7, 9, 11, 13, 15} olduğu zaman doğrudur .

  • value & 2value/2tuhaf {2, 3, 6, 7, 10, 11, 14, 15} olduğu zaman doğrudur .

  • value & 4value/4tuhaf {4, 5, 6, 7, 12, 13, 14, 15} olduğu zaman doğrudur .

  • value & 8value/8tuhaf olduğunda doğrudur {8, 9, 10, 11, 12, 13, 14, 15}.

Sayılardaki 0x öneki, onaltılık bir sayı olarak yorumlanması gerektiği anlamına gelir . Sadece 0x8'e kadar gittiğinizde biraz gereksizdir, ancak koruyuculara muhtemelen bir bit maskesi olarak kullanıldığını söyler.


1
İfadeler, tüm sayılara genişletilebileceğini önerebilir, bu doğru değildir: 8/6garip, 8&6yanlış verir.
Sjoerd

@Sjoerd bu yüzden "2'nin güçleri" dedim
cırcır ucube

5

Bu if-ifadeleri belirli bir bitin valueayarlanıp ayarlanmadığını kontrol eder.

0x4Örneğin, onaltılık değer , sağdan 3. bite 1ve diğer tüm bitler olarak ayarlanır 0. &İkili- ve operatörünü ( ) iki çalıştırıcı ile kullandığınızda, sonuç her iki çalıştırıcıda 01 olan bitler dışında tüm bitlere ayarlanmış olacaktır .

Eğer hesaplama yaptığınızda Yani value & 0x4, ya olsun ikili 00000000veya ikili 00000100ait olsun veya olmasın 3 bitine bağlı valueolduğu 1veya 0. Birincisi değerlendirir false, ikincisi trueise if if bloğu yalnızca 3. bitin ayarlandığı değerler için yürütülür.


1

Burada dikkat edilmesi gereken iki ilginç nokta var.

İlk olarak, bu, integral değerin düşük dereceli 4 bitinin her birini kontrol etmek için ortak bir modeldir. Karşılık gelen bit ayarlanmışsa if koşulu karşılanır. 2 değeri için bit kalıbı aslında 0010'dur.

Bir diğer ilginç soru ise neden (int)oyuncu kadrosu? C ++ 'da C-dökümleri kullanmanın kötü tarzı dışında, tamsayı veya karakter değerleri için bu dönüşüm gerekmez. Bir bool anlamsızdır, bir çift / şamandıra geçici bir tamsayıya dönüştürülür ve bir enumu test etmek için değişmez değerler kullanmak olağandışı olurdu. Bir işaretçi ile mantıklı olabilir, ancak bu çok özel bir kullanımdır. Sonuç: oyuncu kadrosu hiçbir anlam ifade etmiyor.

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.