2011-05-20 19 views
38

Bayrak bitleriyle ilgili bir sorunum var. Bayrakları tutmak için bir int değişkenim var. İlk önce bu değişkene bazı bayraklar koydum. Daha sonra, o değişkende kaç tane bayrak ayarlandığını kontrol etmeliyim. Ama bunu bilmiyorum.Bayrak bitlerini denetleme java

cevap

65

biraz değer ayarlanmış olup olmadığını görmek için kontrol etmek için:

int value = VALUE_TO_CHECK | OTHER_VALUE_TO_CHECK; 

if ((value & VALUE_TO_CHECK) == VALUE_TO_CHECK) 
{ 
    // do something--it was set 
} 

if ((value & OTHER_VALUE_TO_CHECK) == OTHER_VALUE_TO_CHECK) 
{ 
    // also set (if it gets in here, then it was defined in 
    // value, but it does not guarantee that it was set with 
    // OR without other values. To guarantee it's only this 
    // value just use == without bitwise logic) 
} 

O bunu tüm veya Yok temsil sürece 0 olarak işaretli bir değere sahip olmamalıdır (ve bitsel mantık kullanmayın dikkat etmek önemlidir karşılaştırmak için; herhangi value & 0 Ayrıca DAİMA 0.

+0

Burada bayraklarım yok (VALUE_TO_CHECK gibi). Bazı bayraklar içeren başka bir değişkenim var. bu yüzden A'yı bulmalıyım. Tüm bayraklar cadı B'de mevcut olsun veya olmasın. – Nagaraju

+2

@Naga raju lütfen sorunuza cevap verin. – EJP

+1

Bir grup bayrak ayarlanmış bir değeriniz varsa: 'int A = flag1 | flag3 | flag15; 've tüm değerlerin B''den mi olduğunu görmek istersiniz: int B = flag3 | flag15; ', sonra yukarıdaki kodda B' _is_' VALUE_TO_CHECK': 'if (A & B == B)' (korkunç değişken isimlerini dikkate almazsak). Ayrıca, bunun kafanız karışmış gibi göründüğünden, trashgod'un cevabını referans almalı ve başvurulan kitabı satın almalısınız (Josh Bloch tarafından). Java geliştiricisi olarak sahip olmak için en iyi kitap. – pickypg

30

çünkü sadece) value == 0 kullanın bit alanları yerine bir EnumSet kullanmayı düşünün. Ayrıca bkz. Bloch, Item 32.

Zeyilname: Bir beton example gibi:

Enum da zengin sağlamak kümelerini, geleneksel bit bayrakları için türgüvenli yedek: Özellikle

EnumSet.of(Style.BOLD, Style.ITALIC); 

Not uygun yöntemler AbstractSet miras ve AbstractCollection.

+0

Bit alanlarını değiştirmek için bunu nasıl kullanırım? Zıplamayı başaramam. – Suragch

+0

Nerede sorun yaşadığınızdan emin değilim; daha fazla örnek bulunabilir [burada] (http://stackoverflow.com/search?tab=votes&q=%5bjava%5d%20EnumSet%20bit%20field). – trashgod

14

Eğer ab setindeki tüm bayrak bitlerini sahip olmadığını kontrol etmek istiyorsanız, gibi kontrol edebilirsiniz: eğer, Ancak

public class BitFlags 
{ 
    public static boolean isFlagSet(byte value, byte flags) 
    { 
     return (flags & value) == value; 
    } 

    public static byte setFlag(byte value, byte flags) 
    { 
     return (byte) (flags | value); 
    } 

    public static byte unsetFlag(byte value, byte flags) 
    { 
     return (byte) (flags & ~value); 
    } 
} 

: Aşağıdaki kullanıyorum

(a & b) == b 
7

"Düşük seviye" gerekmez, bunun yerine eklenen güvenlik türü için EnumSets kullanılması önerilir.