Bit bayrakları ayıklamak için en etkili yolu

2 Cevap php

Ben bu olası bit bayrakları var.

1, 2, 4, 8, 16, 64, 128, 256, 512, 2048, 4096, 16384, 32768, 65536

Yani her sayı server tarafında bir doğru / yanlış deyimi gibi. Ilk 3 madde ve sadece ilk 3 madde sunucu tarafında "gerçek" olarak işaretlenmiş Yani, web hizmeti bir 7 dönecektir. Ya da tüm 14 ürün üzerinde doğruysa, ben hala geri tek bir sayı elde ediyorum olan web hizmeti tüm bu sayıların toplamı.

Ben "gerçek" olarak işaretlenmiş hangi öğeleri bulmak için geri almak sayıda işlemek için en iyi yolu nedir?

2 Cevap

Biraz maskeleme operatörünü kullanın. C dilinde:

 X & 8

"8" ler bit ayarlı ise, doğrudur.

Sen bit maskeleri numaralandırmak ve set kaç sayabilirsiniz.

If it really is the case that the entire word contains bits, and you want to simply compute how many bits are set, you want in essence a "population count". The absolute fastest way to get a population count is to execute a native "popcnt" usually available in your machine's instruction set.

Eğer uzayda umurumda değil ise, countedbits[...] precomputed bit sayıları ile değerine göre endeksli bir dizi ayarlayabilirsiniz. Daha sonra tek bir bellek erişimi sizin bit sayısını hesaplar.

Sık sık kullanılan, sadece düz "bit twiddling code" bu biraz sayar hesaplar:

(Kernigan yöntemi):

unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
for (c = 0; v; c++)
{
  v &= v - 1; // clear the least significant bit set
}

(Paralel bit summming, 32 bit)

v = v - ((v >> 1) & 0x55555555);                    // reuse input as temporary
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);     // temp
c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count

Önce biraz twiddling kesmek görmediyseniz, bir tedavi için konum.

PHP, komik olma, bu aritmetik bazı komik şeyler olabilir.

Bir yolu numara döngü olacaktır, bunu (2 ile yani böl) değişen sol ve ve kullanarak 1 ile ilk bit karşılaştırmak işlenen.