2010-04-25 13 views
5

W jakimś kodzie, nad którym pracuję, powinienem zająć się 10 niezależnymi parametrami, które mogą przyjąć jedną z dwóch wartości (0 lub 1). Tworzy to 2^10 różnych warunków. Niektóre z tych warunków nigdy nie występują i można je pominąć, ale te, które występują, są nadal DUŻE i sprawienie, że switch radzi sobie we wszystkich przypadkach, jest szalone.Bitowe obliczanie i detekcja bitów

Chcę użyć instrukcji 10 if zamiast ogromnego switch. W tym celu wiem, że powinienem używać bitów flagowych, lub raczej bajtów flagowych, ponieważ językiem jest javascript i łatwiej jest pracować z 10-bajtowym łańcuchem, który reprezentuje 10-bitowy plik binarny.

Mój problem polega na tym, że nie wiem, jak to wdrożyć. Widziałem, jak to zostało użyte w API s, gdzie można wybrać wiele opcji z liczbami 1, 2, 4, 8, ..., n^(n-1), które są dziesiętnymi odpowiednikami 1, 10, 100, 1000 itd. .w formacie binarnym. Więc jeśli wywołujemy połączenie takie jak bar = foo(7), pasek będzie obiektem z dowolnymi opcjami, które umożliwiają włączenie trzech prawych flag.

Mogę konwertować liczbę dziesiętną na binarną iw każdym sprawdzeniu oświadczenia if, aby sprawdzić, czy odpowiednia cyfra jest ustawiona, czy nie. Ale zastanawiam się, jest sposób na określenie cyfry liczby dziesiętnej jest zero lub jeden w formie binarnej, bez faktycznie robi konwersji?

Odpowiedz

6

Po prostu użyj bitowego-and. W C/C++, to byłoby:

if (flags & 1) { 
    // Bit zero is set. 
} 
if (flags & 2) { 
    // Bit one is set. 
} 
if (flags & 4) { 
    // Bit two is set. 
} 
... 

Dla dobra produkcyjnego używać nazw symbolicznych dla masek flag zamiast liczb magicznych, 1, 2, 4, 8, itd

Jeśli flagi są jednorodne w jakiś sposób (np reprezentują dziesięć wymiarów przestrzennych w jakiś problem geometrii) oraz kod do obsługi każdy przypadek jest taki sam, można użyć pętli:

for (int f = 0; f < 10; ++f) { 
    if (flags & (1 << f)) { 
     // Bit f is set. 
    } 
} 
+0

WOW! Bardzo szybko! Chciałem od razu przyjąć twoją odpowiedź, ale najwyraźniej powinienem poczekać przynajmniej 9 minut. Dzięki naprawdę. –

+0

+1 pisał coś podobnego, ale byłeś szybszy;) –

1

można uzyskać numer, który ma n-ty bit set i ORAZ z twoim numerem. Jeśli wynik wynosi zero, twój numer nie ma ustawionego bitu. W przeciwnym razie. Zobacz także here.

2

Można użyć bitowego oraz:

10 & 2^1 is true because 10 = 1010b 
           ^1 
8 & 2^1 is false because 8 = 1000b 
           ^0 
10 & 2^3 is true because 10 = 1010b 
          ^1