Šta je bit maska
Bit maska je broj koji se koristi zbog svog obrasca bitova, a ne zbog vrednosti. Svaka pozicija bita predstavlja jednu opciju uključeno/isključeno, pa jedan ceo broj može da drži 8, 32 ili 64 zastavice odjednom. Dozvole (rwx), režimi otvaranja datoteka, bitovi mogućnosti CPU-a, mrežne maske i skupovi opcija u gotovo svakom C API-ju su bit maske.
Bit n ima vrednost 2ⁿ, pa je maska sa postavljenim bitovima 0, 2 i 7 jednaka 1 + 4 + 128 = 133 = 0x85 = 1000 0101. Da biste napravili konstantu u kodu, pomerite jedinicu na tu poziciju: 1 << 7.
Korišćenje maske
| Želite da… | Uradite ovo |
|---|---|
| Proverite da li je zastavica postavljena | (value & FLAG) != 0 |
| Proverite da li su sve od više zastavica postavljene | (value & MASK) == MASK |
| Postavite zastavicu | value |= FLAG |
| Obrišete zastavicu | value &= ~FLAG |
| Preokrenete zastavicu | value ^= FLAG |
| Izdvojite polje bitova 4–7 | (value >> 4) & 0xF |
| Napravite masku za bitove lo..hi | ((1 << (hi - lo + 1)) - 1) << lo |
Čitanje maske koju ste dobili
Pretvorite vrednost u binarni oblik i numerišite bitove zdesna, počev od 0. Svaka jedinica je postavljena zastavica. Alat iznad to radi za svaku vrednost koju nalepite i prikazuje pozicije kao kompaktnu listu, na primer 0-2, 5, 7.
Primeri
Pitanja
Zašto pozicije bitova počinju od 0?
Zato što bit n ima vrednost 2ⁿ, a 2⁰ = 1 je krajnji desni bit. Numerisanje od 0 čini da se aritmetika poklapa: pomeranje za n stavlja jedinicu na bit n.
Koja je razlika između bit maske i bit polja?
Bit maska je broj sa kojim radite AND ili OR. Bit polje je grupa susednih bitova unutar veće vrednosti koji zajedno čuvaju mali broj (na primer bitovi 4–7 koji drže vrednost 0–15). Za čitanje ili upis bit polja koristite masku i pomeranje.
Koliko zastavica staje u ceo broj?
Jedna po bitu: 8 u bajt, 32 u 32-bitni int, 64 u 64-bitni int. Ako vam treba više, koristite niz celih brojeva ili namenski bitset tip.
Zašto 1 << n umesto da napišem broj?
Dokumentuje na koji bit mislite i ne može da se pogrešno otkuca kao drugi stepen dvojke. Kompajleri ga svode na konstantu, pa nema troška u vreme izvršavanja.
Da li alat ispravno radi sa 64-bitnim maskama?
Da. Koristi cele brojeve proizvoljne preciznosti, pa su sva 64 bita tačna, uključujući bit 63.