if() operacje na bitach

if() operacje na bitach
C1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 22
0

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

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

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

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

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

stivens
  • Rejestracja: dni
  • Ostatnio: dni
4

Napisz kilka przykladowych inputow oraz oczekiwany output dla nich

AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1493
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.

AN
  • Rejestracja: dni
  • Ostatnio: dni
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):

Kopiuj
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.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
3
andrzejlisek napisał(a):

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

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

Kopiuj
if((1)&((1)^(zmienna)^(rejestr>>3))) { ... }
AN
  • Rejestracja: dni
  • Ostatnio: dni
0
_13th_Dragon napisał(a):
andrzejlisek napisał(a):

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

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

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.