Bugün "Programlama İncileri" okumaya başladım ve egzersiz yaparken "Buradaki bit vektörünü nasıl uygularsınız?" Ben çözümü bakıldığında böyle oldu: Ben de karıştı alıyorumBit Programlamada aşağıdaki programda bulunan maskeleme kullanımı Pearls
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1 + N/BITSPERWORD];
void set(int i) { a[i >> SHIFT] |= (1 << (i & MASK));
burada neler olduğunu
1 << (i & MASK)
birisi bana açıklayabilir misiniz bu ifade doğrudur? SHIFT
BITSPERWORD
tam baz-2 logaritma olduğu MASK
, en düşük SHIFT
bitleri sahip olacak şekilde ayarlandığını
Yanıt Henning için teşekkürler. Eğer (i & MASK) 'i (i% 32) ile değiştirirseniz bu geçerli olur mu? Geçerli ama zarif değilse, o zaman ben ve MASK'ın neden% 32'nin üzerinde tercih edildiğine dair biraz ışık tutabiliyor musunuz? Çok teşekkürler. – test123
Evet - 'i & MASK' ve' i% 32', negatif olmadığından emin olduğunuzla aynı şeydir. Bitsel AND, tipik olarak geri kalan bir bölümden daha verimlidir ve bu nedenle geleneksel seçim haline gelmiştir. Ya da en azından, aptallar nerede derlerse daha verimli olurlar. Bugün bile, orta düzeyde bir derleyicinin, bu bağlamda 'i' 32 'i' ve 31 '' i yeniden yazmasını bile bekleyebilirsiniz (ya da "i" nin negatif olmadığını, bu durumda yeniden yazmanın her zaman güvenli olduğunu ya da Olumsuz bir sonucun, vardiyada tanımlanmamış davranışları tetiklemesine sebep olabilir. –
Harika. Açıklama için çok teşekkürler. – test123