2010-12-28 17 views
22

mam następujące:pytanie o bitmask?

public static final int LIMIT_ONE = 1; 
public static final int TRADEABLE = (1 << 1); 
public static final int SELLABLE = (1 << 2); 
public static final int STORABLE = (1 << 3); 
public static final int STORABLE_IN_WH = (1 << 4); 
public static final int STORABLE_IN_LEGION_WH = (1 << 5); 
public static final int BREAKABLE = (1 << 6); 
public static final int SOUL_BOUND = (1 << 7); 
public static final int UNK9 = (1 << 8); 
public static final int UNK10 = (1 << 9); 
public static final int UNK11 = (1 << 10); 
public static final int CAN_COMPOSITE_WEAPON = (1 << 11); 
public static final int BLACK_CLOUD_TRADERS = (1 << 12); 
public static final int CAN_SPLIT = (1 << 13); 
public static final int UNK15 = (1 << 14); 
public static final int UNK16 = (1 << 15); 

i chciałem zrozumieć, w jaki sposób jest obliczana dać wynik obserwacji, na przykład:

Jestem naprawdę pojęcia, w jaki sposób praca bitową i jeśli każdy może może dać kilka wskazówek i wyjaśnić, jak to idzie do tej liczby, którą bardzo doceniłbym.

+0

Czy chcesz wiedzieć, co "<<" robi? Nie rozumiem tego pytania. –

+0

@Nikita z powyższego zestawu Chciałem zrozumieć, w jaki sposób generuje maskę bitową 12414 i jak ją przywrócić. – Prix

Odpowiedz

20

Wyrażenie (1 << n) jest równoważne z 2 podniesionymi do potęgi n.

Podczas pisania (1 << n) | (1 << m) jest to to samo, co, o ile różne są n i m. Więc możesz myśleć o tym w kategoriach prostych dodatków, jeśli chcesz.

Numer 12414 w binarnym 11000001111110 więc suma (lub bitowe LUB) z poniższych znaczników:

 
TRADEABLE    1 << 1 =  2 
SELLABLE     1 << 2 =  4 
STORABLE     1 << 3 =  8 
STORABLE_IN_WH   1 << 4 = 16 
STORABLE_IN_LEGION_WH 1 << 5 = 32 
BREAKABLE    1 << 6 = 64 
BLACK_CLOUD_TRADERS  1 << 12 = 4096 
CAN_SPLIT    1 << 13 = 8192 
======================================== 
         Total = 12414 

Należy zauważyć, że flag, które są zawarte odpowiadają bitów, które są ustawione w binarnym reprezentacja 12414, gdy czytana jest od prawej do lewej.

+1

Prawidłowo, ale może był on pytany, jak znaleźć, które flagi są przechowywane w danym numerze (na przykład 12414) - szuka operatora '&' imho. – Konerak

+0

Tak (1 << 1) dałoby 2? i (1 << n) + (1 << m) dałoby 14, gdzie n = 3 i m = 4? – Prix

+0

@Konerak tak Chciałem wiedzieć, jak powrócić z tego numeru. – Prix

0

Nie rozumiem pytania "w jaki sposób jest obliczany, aby dać następujący wynik". (Co jest obliczane?)

Najważniejsze, aby zrozumieć, że wszystkie wartości komputerowe są przechowywane w postaci binarnej. Dowolna liczba będzie kombinacją 0 i 1 bit. Niektóre liczby mają tylko jeden 1 bit.

http://en.wikipedia.org/wiki/Mask_(computing)

5

a << b przesuwa bity w ab wartości w lewo, dopełnienie nowe bity z prawej strony zerami. 1 << n jest równy liczbie całkowitej z tylko jednym zestawem bitów (licząc od 0 z prawej), który jest równoważny 2 n.

12414 jest 11000001111110 w systemie binarnym. Dlatego jest wytwarzany przez zsumowanie stałych wymienionych poniżej. Możesz to rozwiązać, widząc bit 1 z prawej strony, dlatego TRADEABLE jest "ustawiony"; bit 7 nie jest ustawiony (to 0), dlatego SOUL_BOUND nie jest "ustawiony". Zwróć uwagę, w jaki sposób liczby bitów wiążą się z zadeklarowanymi wartościami (1 << n).

TRADEABLE 
SELLABLE 
STORABLE 
STORABLE_IN_WH 
STORABLE_IN_LEGION_WH 
BREAKABLE 
BLACK_CLOUD_TRADERS 
CAN_SPLIT 
+0

++ Jesteś szybki! Pokonaj mnie. –

0

Domyślam się, że bierzesz pewną liczbę, jak na przykład 12414 i wiesz, jakie właściwości są w niej zawarte.

Na przykład, ponieważ 12414 jest 11000001111110 w binarnym, cokolwiek jest dołączone, jest zbywalne, ponieważ ORAZ tej liczby z maską da ci 1 w drugim bicie.

0

binarnie 12414 jest 11000001111110. LIMIT_ONE binarnie oznacza 1, a < <, który jest operatorem Bitshift przesuwa zera do lewej wyściółką z zerem na prawo. Dlatego też, zbywalne w systemie binarnym jest 10 i tak dalej, aż do unk16, co kończy się być 1000000000000000. Teraz umieścić te wartości razem za pomocą bitowego OR, który zasadniczo stawia 1 na każdej pozycji, gdzie co najmniej jeden z jej operand ma jeden na tej pozycji (operator rury "|" jest używany w większości języków).

Przykład:

100 | 10 = 110 

Dlatego, aby dostać się do 12414, trzeba zrobić bitowego lub na następujące zmienne: unk16, unk15, zbywalne, selleable, Pomaranczowy, Pomaranczowy w Wh, Pomaranczowy w wh legionowych i łamliwe. Kombinacja tych na różnych pozycjach w każdej z tych zmiennych daje binarny 11000001111110, który okazuje się być 12414 w systemie dziesiętnym.

Jest to prawdopodobnie najprostszy sposób wyjaśnienia, jeśli chcesz wiedzieć więcej, powinieneś przeczytać na temat operatorów bitowych i jak działa binarna reprezentacja liczb.

Aby dowiedzieć się, która z flag ma numer 12414, można użyć operatora & (bitowe AND) i wykonać zerowanie. Np

6 & 2 = 2 (110 has a 1 on the same position as 2, which is 010) 
6 & 1 = 0 (110 does not have a 1 on the same position as 1, which is 001) 
34

12414 w binary jest:

Binary number: 1 1 0 0 0 0 0 1 1 1 1 1 1 0 
------------------------------------------------------- 
Bit positions: 13 12 11 10 9 8 7 6 5 4 3 2 1 0 

wygląd, w którym bity są 1. Są flagi które są ustawione na maskę bitową, który jest utworzony za pomocą bitowe LUB operatorowi połączyć flagi:

bitmask = TRADEABLE | SELLABLE | STORABLE | STORABLE_IN_WH | STORABLE_IN_LEGION_WH | BREAKABLE | BLACK_CLOUD_TRADERS | CAN_SPLIT; 

aby dodatkowo wyjaśnić, STORABLE = (1 << 3); oznacza, że ​​magazynować jest równa liczbie jednego (binarne 1, wchodzących dopiero na pozycji bitu 0) shi po lewej stronie o 3 miejsca. Zauważ, że STORABLE = Math.pow(2, 3); byłby równoważny. Ponieważ żaden z bitów nie nakłada się na flagi, możemy połączyć je wszystkie w pojedynczą int, a następnie rozdzielić je później.

Możemy sprawdzić istnienie flag używając bitowego i operator, który będzie zwracać wartość niezerową jeśli flaga jest ustawiona a zero jeśli flaga nie jest ustawiona:

if(bitmask & TRADEABLE != 0) { 
    // This item can be traded 
} else { 
    // This item cannot be traded 
} 

Mamy można ustawić, wyczyścić lub przełącz flagi w następujący sposób:

bitmask |= TRADEABLE; // Sets the flag using bitwise OR 
bitmask &= ~TRADEABLE; // Clears the flag using bitwise AND and NOT 
bitmask ^= TRADEABLE; // Toggles the flag using bitwise XOR 
+0

bardzo dziękuję, to naprawdę łatwy sposób na sprawdzenie, czy maska ​​bitowa zawiera coś, czy nie! – Prix