if() operacje na bitach

0

Witam,
jak sprawdzić warunkiem If zmienną stosując negacje z rejestrem ??

if ( !(stan_enkodera & enkoder1) ) == (enkoder1_PIN  & enkoder1 ) )

i jeszcze jeden podobny przykład jak sprawdzić bit pierwszy zmiennej z rejestrem czwartego bitu ??

if((stan_enkodera & 0b1111 11110) == (enkoder1_PIN  & enkoder1 ))

próbowałem na różne sposoby i nic nie wychodzi....

4

Napisz kilka przykladowych inputow oraz oczekiwany output dla nich

1

To na jakieś embeddy wygląda. Co to jest enkoder1, stan_enkodera, enkoder_PIN (to ostatnie raczej jest dość oczywiste ale wolę spytać), jakie wartości może toto przyjmować i co z tym chcesz zrobić, bo póki co Twoje pytanie jest niejasne.
Oraz (niekonieczne bardzo ważne tu, ale jednak...): C czy C++, bo tagi to jedno, ale chciałbym uczulić, że to są różne języki.

0

Znak negacji bitowej liczby to ~.

Nie wiem, czy dobrze rozumiem, ale jeżeli chcesz sprawdzić identyczność bitu 1 zmiennej z bitem 4 rejestru, to można zrobić tak (to nie jedyne możliwe sposoby):

if (((zmienna & b00000001) && (rejestr & b00001000)) || ((!(zmienna & b00000001)) && (!(rejestr & b00001000))))
{
   // Zmienna z maska traktowana jest jako zmienna boolean, identyczność bitów to ((prawda i prawda) lub (fałsz i fałsz))
}
if (((zmienna & b00000001) == ((rejestr & b00001000) >> 3)))
{
   // porownianie liczbowe, przy czym druga liczbe nalezy sprowadzic poprzez nadanie stanu 0 lub 1 za pomoca  przesuniecia bitowego
}

Chodzi o to, że są to tak naprawdę dwie liczby i albo obie są zerem, albo obie są różne od zera, przy czym ich wartość jest inna.

Natomiast porównanie negacji bitu rejestru z bitem zmiennej to tak naprawdę zaprzeczenie identyczności bitu z rejestrem, a więc zaprzeczenie powyższych warunków. Negacja zmiennej (zamiana wszystkich bitów na stan przeciwny) to ~zmienna.

3
andrzejlisek napisał(a):

... (to nie jedyne możliwe sposoby) ...

Zgadza się, tylko nie kumam czemu wybrałeś nie najlepsze.

if((1)&((1)^(zmienna)^(rejestr>>3))) { ... }
0
_13th_Dragon napisał(a):
andrzejlisek napisał(a):

... (to nie jedyne możliwe sposoby) ...

Zgadza się, tylko nie kumam czemu wybrałeś nie najlepsze.

if((1)&((1)^(zmienna)^(rejestr>>3))) { ... }

Zupełnie zapomniałem o funkcji XOR, która tu się sprawdzi i rzadko programuję w C i C++. Oczywiście, że sposobów jest dużo, są lepsze i gorsze. Sam się uczę, nie będę upierać się przy swoim.

1 użytkowników online, w tym zalogowanych: 0, gości: 1