2010-09-19 38 views
12

iOS/Objective-C'de bir bit dizisini nasıl uygularım ?: Çok sayıda boole değeri var.C/Objective C

Bu değerleri saklamak için verimsiz bir yoldur - her bir öğe için yalnızca bir tane gerektiğinde en az sekiz bit kullanılır.

Nasıl en iyi duruma getirebilirim?

+1

birinin kullanabilirsiniz şey yazılı olup olmadığını görmek için arama denediniz mi? İnsanlar senin için sadece senin kodunu yazmayacaklar. –

+2

Aslında bir soru sorarak ve cevaplayarak yazdığım bazı kodları paylaşmaya çalışıyordum, ancak bu site çok hızlı! 10 dakika içinde cevapımı bir araya getirmemi sağladı, zaten iki cevap çıktı! –

+0

SO, kendinize cevap verebilecek sorular sormaz. Ve hatta o zaman bile web üzerinde konuyla ilgili olanı araştırmayı düşünebilir ve yaklaşımınızı ilk önce ne bulduğunuzla karşılaştırın. –

cevap

14

bu deneyin bir CFType seçeneği

+2

http://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFBitVectorRef/Reference/reference.html – JeremyP

+0

Ancak bu sınıflar, 32 bitlik girişlere ayrılan CFBit nesnelerini saklar. Yani bu çözüm, sadece çok fazla bellek harcar. –

+8

@whitman değerleri CFBit olarak geçirilir; Bu onların * depolandığı anlamına gelmez. Sadece CFBitVector uygulamasına baktım (r.550.13). Tahsis boyutları 64 ile bölünebilen bir sayıya yuvarlanırken, bellek tüketimi bir miktardır. Genel olarak oldukça muhafazakar bir uygulama. – justin

6

Bitsel mantıksal işlemleri ve bit kaydırmayı kullanırsınız. (Bu terimleri bir Google arama size bazı örnekler verebilir.)

Temelde o zaman yapmak istediğiniz bit, o zaman "shift" tamsayı değerleri (vb int, char dahil) bir tamsayı türü bildirmek bir OR veya bir AND tamsayı ile. (C++)

Bazı hızlı açıklayıcı örnekler: Bu sabit boyutta (sizeof(int) * 8 bit) "bit dizileri" sağlar

inline bool bit_is_on(int bit_array, int bit_number) 
{ 
    return ((bit_array) & (1 << bit_number)) ? true : false; 
} 

inline void set_bit(int &bit_array, int bit_number) 
{ 
    bit_array |= (1 << bit_number); 
} 

inline void clear_bit(int &bit_array, int bit_number) 
{ 
    bit_array &= ~(1 << bit_number); 
} 

not edin. Belki senin için sorun değil, belki de bunun üstünde bir şey inşa etmek isteyeceksin. (Ya da bazı kütüphane ne sağlarsa kullanın.)

Bu, bool dizilerinden daha az bellek kullanacaktır ... NASIL ... Bu bitlere erişmek için derleyicinin oluşturduğu kod daha büyük ve daha yavaş olacaktır. Dolayısıyla, bu bit dizilerini içermesi gereken çok sayıda nesneye sahip değilseniz, hem hız hem de bellek kullanımı üzerinde net-negatif bir etkiye sahip olabilir.

#define BITOP(a,b,op) \ 
((a)[(size_t)(b)/(8*sizeof *(a))] op ((size_t)1<<((size_t)(b)%(8*sizeof *(a))))) 

Sonra size_t daha büyük işaretsiz tamsayı elemanlarının herhangi dizisi için, BITOP makro biraz dizi olarak dizi erişebilirsiniz:

+1

Soru C++ olarak etiketlenmedi. Belki de kodunuzu C. – JeremyP

+2

@JeremyP'ye dönüştürmelisiniz - Yine de açıklayıcı bir örnek. İşaretçiler yerine referansları kullanmaya karar verdim çünkü sorulan sorudan daha az dikkat dağıtıcı olacağını düşündüm. Bence bu nokta tamamlandı ve cevabın bir başkasının çözümüne yapıştırılmış olması gerekmiyordu. – asveikau

+4

soru C ile ilgilidir. Soru sahibi, bir referansın ne olduğunu bile bilmeyebilir. Eğer durum böyleyse, daha az dikkat dağıtmadınız, daha çok dikkatiniz dağıldı. – JeremyP

11

için CFMutableBitVector/CFBitVector bakınız . Örneğin:

unsigned char array[16] = {0}; 
BITOP(array, 40, |=); /* sets bit 40 */ 
BITOP(array, 41, ^=); /* toggles bit 41 */ 
if (BITOP(array, 42, &)) return 0; /* tests bit 42 */ 
BITOP(array, 43, &=~); /* clears bit 43 */ 

vb

+1

Herhangi bir C ortamına tam taşınabilirliği önemsiyorsanız, 8'leri "CHAR_BIT" ile değiştirin. –

+0

Aslında, "CHAR_BIT> 8" olan platformlarda bitleri boşa harcamayı umursamıyorsanız ve 8 ya da 10 ile bölünme gibi şeyleri tanıtmaktan daha iyi bir performans sunacaksa, 8, her yerde gayet iyi çalışıyor ... –

+0

Açık çalışmayı desteklemek & = ~ hangisi iki operatör, & = ve ~, makronun ikinci yarısını başka bir parite kümesinde sarmanız gerekir. Aksi halde, demek istemediğin bir şey yazarsın. #define BITOP (a, b, op) ((a) [(size_t) (b)/(8 * sizeof * (a))] op ((size_t) 1 << ((size_t) (b)% (8 * sizeof * (a))))) –

0

Ben 'bit' benzer bir Java BitSet için büyük miktarlarda yönetmek için niyet, biraz dizi çerçeve yazıyorum ben bu soruya geldi. Karar verdiğim adın diğer Objective-C çerçevelerine aykırı olup olmadığını görmek istiyorum.

Her neyse, sadece bunu başlıyorum ve SourceForge veya diğer açık kaynak barındırma sitelerinde yayınlanıp yayınlanmayacağına karar veriyorum.

Eğer

Düzenleme ilgilenen varsa bana bildirin: SourceForge'de üzerinde BitArray denilen projeyi, oluşturduk. Kaynak SF SVN deposunda ve ayrıca derlenmiş bir çerçeve yükledim. Bu LINK oraya varır.

  • Frank
2
#define BITOP(a,b,op) \ 
    ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a)))) 

çalışmaz ...

Fix:

#define BITOP(a,b,op) \ 
((a)[(size_t)(b)/(8*sizeof *(a))] op ((size_t)1<<((size_t)(b)%(8*sizeof *(a)))))