Pytanie Jak sprawdzić, czy bitmask zawiera bit?


Nie bardzo rozumiem tę całą koncepcję maski bitowej.

Załóżmy, że mam maskę:

var bitMask = 8 | 524288;

Nie podoba mi się, że tak się połączy 8 i 524288, i dostać 524296.

ALE, jak mam pójść w drugą stronę? Jak sprawdzić moją maskę bitową, aby zobaczyć, czy zawiera 8 i / lub 524288?

Aby było nieco bardziej skomplikowane, powiedzmy, że mam maskę bitową 18358536 i muszę sprawdzić, czy 8 i 524288 są w tej masce bitowej. Jak bym to zrobił?


13
2018-01-23 12:40


pochodzenie




Odpowiedzi:


dobrze

if (8 & bitmask == 8 ) {
}

sprawdzi, czy maska ​​bitowa zawiera 8.

bardziej złożony

int mask = 8 | 12345;
if (mask & bitmask == mask) {
   //true if, and only if, bitmask contains 8 | 12345
}

if (mask & bitmask != 0) {
   //true if bitmask contains 8 or 12345 or (8 | 12345)
}

może być zainteresowany enum, a dokładniej FlagsAttibute.


24
2018-01-23 12:43



Alternatywnie, if ((mask & bitmask) != 0). Jeśli znajdziesz to nieco jaśniej (być może z powodu tego, ile razy piszę != null przez lata). - Slipp D. Thompson


jestem prawie pewien (A & B)==B gdzie A jest maską bitową i B czy cokolwiek chcesz sprawdzić, powinno zrobić.

Przykład:

if((18358536 & 8) == 8) 
{
    // mask contains 8
}

5
2018-01-23 12:44





Przede wszystkim maski bitowe działają na bitach, a nie na liczbach całkowitych. Znacznie łatwiej zrozumieć, kiedy mamy do czynienia tylko z liczbami 1 i 0, niż z bardziej złożonymi liczbami.

Na przykład:

1000110000010000100001000 = 18358536 w systemie binarnym.

0000010000000000000000000 = 524288 w systemie binarnym.

0000000000000000000001000 = 8 w binarnym.

0000010000000000000001000 = 524296 w systemie binarnym.

Dzięki temu oczywiste jest, że liczba całkowita 8 jest 4-bitowa od prawej strony i nie zaznaczono żadnych innych bitów, więc gdy dodamy 8 do 524288 (tylko 20-bitowy), po prostu zaznaczamy 4 i 20 bitów jako prawdziwe. Możemy więc użyć tej samej przestrzeni w pamięci zarezerwowanej dla liczby całkowitej do przechowywania wielu flag, które definiują niektóre właściwości boolowskie.

Jak już wyjaśnił Alex, możesz sprawdzić, czy flaga bitowa jest dostępna w masce bitowej za pomocą operatora AND:

if (maska ​​i flaga) == flaga) {// maska ​​ma ustawioną flagę jako true}

Możesz czytać wszystko o bitmaskach w tym artykule


0
2018-05-31 07:45