Chyba masz się mylić między tablicami i cyfr, a konkretnie co to znaczy manipulować liczb binarnych.
Pójdę o tym za pomocą przykładu. Załóżmy, że masz kilka komunikatów o błędach i chcesz zwrócić je w zwracanej wartości z funkcji. Teraz możesz oznaczyć swoje błędy 1,2,3,4 ... co ma sens w twoim umyśle, ale w jaki sposób, biorąc pod uwagę tylko jeden numer, można ustalić, które błędy wystąpiły?
Spróbuj teraz opisać błędy 1,2,4,8,16 ... zwiększając moce dwojga. Dlaczego to działa? Cóż, kiedy pracujesz w bazie 2, manipulujesz liczbą taką jak 00000000
, gdzie każda cyfra odpowiada potędze 2 pomnożonej przez jej pozycję od prawej. Powiedzmy, że występują błędy 1, 4 i 8. Cóż, może to być reprezentowane jako 00001101
. W odwrotnej kolejności pierwsza cyfra = 1 * 2^0, trzecia cyfra 1 * 2^2 i czwarta cyfra 1 * 2^3. Dodanie ich wszystkich daje 13.
Teraz jesteśmy w stanie sprawdzić, czy taki błąd wystąpił poprzez zastosowanie maski bitowej. Na przykład, jeśli chcesz się dowiedzieć, czy wystąpił błąd 8
, użyj reprezentacji bitowej 8 = 00001000
. Teraz, w celu wydobycia, czy nie, że wystąpił błąd, należy użyć binarny i tak:
00001101
& 00001000
= 00001000
Jestem pewien, że wiesz, w jaki sposób działa i czy można go wywnioskować z powyższego - cyfra mądry pracy jeśli jakieś dwie cyfry są zarówno 1, wynik jest 1, w przeciwnym wypadku 0.
teraz w C:
int func(...)
{
int retval = 0;
if (sometestthatmeans an error)
{
retval += 1;
}
if (sometestthatmeans an error)
{
retval += 2;
}
return retval
}
int anotherfunc(...)
{
uint8_t x = func(...)
/* binary and with 8 and shift 3 plaes to the right
* so that the resultant expression is either 1 or 0 */
if (((x & 0x08) >> 3) == 1)
{
/* that error occurred */
}
}
teraz do praktycznych. Gdy pamięć była rzadka, a protokoły nie miały luksusu pełnego xml itp., Często ograniczano pole jako tak wiele bitów. W tym polu przypisujesz różne bity (flagi, potęgi 2) do określonego znaczenia i stosujesz operacje binarne, aby wydedukować, czy są one ustawione, a następnie działają na nich.
Powinienem także dodać, że operacje binarne są bliskie idei dla podstawowej elektroniki komputera. Wyobraź sobie, że pola bitowe odpowiadają wyjściu różnych obwodów (prąd nośny lub nie). Używając wystarczającej liczby kombinacji tych obwodów, tworzysz ... komputer.
BTW, jest to jeden obszar, w którym C/C++ nie działa. C++ ma wektory bitowe, a C nie. W C musisz napisać własną. Proszę przywyknąć do rozdzielania C/C++ na C lub C++. –