2011-06-21 15 views
5

Moje tutaj trochę zmieszane.Arduino i Bitwise, nieoczekiwany wynik

Chciałbym przetestować, czy zestaw bitów (3 bitów) zawiera nieco w określonej pozycji.

if (B110 & B010 == B010) 

(B110 jest liczbą, aby sprawdzić, B010 bit Chcę zobaczyć, czy jest tam)

Powyższy kod nie daje mi oczekiwany się przyjść, zarówno B110 i B101 jest prawdziwe jest prawdziwe. Jestem całkiem pewny, że muszę użyć & (i), aby przetestować maskę B010.

Rozumiem, że B110 & B010 byłby równy B010, a B101 & B010 byłby równy B000. Ale moja instrukcja if jest uruchamiana z obu bitów testowych?

Mam kodowanie w Arduino, jestem pewien, że to proste nieporozumienie w moim imieniu, ale nie wiem gdzie.

+1

Nie mogłem powstrzymać się od śmiechu z gry słów. – fuzz

Odpowiedz

12

Spróbuj if ((B110 & B010) == B010)

W tej chwili to działa jak if (B110 & (B010 == B010)) który zawsze będzie prawdziwa. !

Jako this table pokazy, == i = mają wyższy priorytet niż &, | itd.

+0

Tak, dokładnie to co chciałem powiedzieć, mogę tylko dodać, że to kompletnie szalony projektantów C, że theu nie zrobił i jest silniejszy niż ==, zmuszając nas do zaśmiecenia naszego kodu z wystarczającą liczbą nawiasów, aby wyglądało jak seplenienie. –

+0

@dren Absolutnie;) Jako ogólna zasada, jeśli robię obliczenia w JEŻELI * zawsze * umieszczam obliczenia w nawiasach własnych. – Majenko

+2

Jeśli są jakiekolwiek wątpliwości, używam dodatkowych parens. Nie znam priorytetu operatorów, ale * wiem * że kompilator będzie przestrzegać parens. – blalor

3

"== B010" jest w rzeczywistości niepotrzebny w tym teście. W języku C, 0 reprezentuje "fałsz", a każda niezerowa wartość jest uważana za "prawdziwą". B110 & B010 (lub dowolna inna wartość z tym zestawem bitów) zwróci B010, która nie jest równa 0, więc test się powiedzie.