Zrozumienie bitowego i operatora

O operatorach bitowych w Objective-C czytałem w książce kochana "Programowanie w Objective-C".

Jestem bardzo zdezorientowany w tej części, chociaż naprawdę zrozumiałam większość wszystkiego, co do tej pory mi przedstawiono.

Oto cytat z książki:

Operator bitowy i

Bitowe ANDing jest często używany do operacji maskowania. Oznacza to, że operator ten może być łatwo użyty do Ustawienia określonych bitów pozycji danych na 0. Na przykład, oświadczenie

w3 = w1 & 3;

Przypisuje w3 wartość bitową W1 i stałą 3. Ma ten sam ffect ustawiania wszystkich bitów w w, poza dwoma prawymi bitami na 0 i zachowując dwa prawe bity z w1.

Podobnie jak wszystkie binarne operatory arytmetyczne w C, operatory bitów binarnych mogą być również używane jako operatory przypisania przez dodanie znaku równości. Oświadczenie

word &= 15;

Dlatego pełni tę samą funkcję co "po": {]}

word = word & 15;

Dodatkowo, ma efekt ustawienia wszystkich, oprócz czterech prawych bitów słowa, na 0. Przy użyciu stałych w wykonywaniu operacji bitowych, Zwykle wygodniej jest wyrazić stałe w notacji ósemkowej lub szesnastkowej.

OK, to właśnie próbuję zrozumieć. Jestem bardzo zdezorientowany z tym całym pojęciem i szukam tylko małego wyjaśnienia, jeśli ktoś będzie chciał mi pomóc w to.

Kiedy książka odwołuje się do" ustawienie wszystkich bitów " teraz, wszystkie bity.. Co dokładnie jest trochę. Czy to nie jest tylko 0 LUB 1 w 2 bazie, innymi słowy, binarne?

Jeśli tak, to dlaczego w pierwszym przykładzie wszystkie bity z wyjątkiem "prawych 2" są równe 0? Czy jest 2, ponieważ jest 3-1, Biorąc 3 z naszej stałej?

Dzięki!
Author: Qcom, 2010-08-07

4 answers

Liczby można wyrazić w postaci binarnej w następujący sposób:

3    = 000011
5    = 000101
10   = 001010

...itd. Zakładam, że znasz binary.

Bitowo i oznacza pobranie dwóch liczb, ułożenie ich na siebie i utworzenie nowej liczby, która ma 1, gdzie obie liczby mają 1 (Wszystko inne to 0).

Na przykład:

    3          =>  00011
  & 5          =>  00101
------           -------
    1              00001

Bitowo lub oznacza pobranie dwóch liczb, ułożenie ich jedna na drugiej i utworzenie nowej liczby, która ma 1, gdzie każda liczba ma 1 (Wszystko inne to 0).

Na przykład:

    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111

Bitowy XOR (exclusive OR) oznacza pobranie dwóch liczb, ułożenie ich jedna nad drugą i utworzenie nowej liczby, która ma 1, gdzie każda liczba ma 1, a druga 0 (Wszystko inne to 0).

Na przykład:

    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  

Bitowe NOR (Not OR) oznacza wzięcie bitowego OR dwóch liczb, a następnie odwrócenie wszystkiego (gdzie było 0, jest teraz 1, gdzie było 1, jest teraz 0).

Bitowe NAND (Not AND) oznacza wzięcie bitowego i dwóch liczb, a następnie odwrócenie wszystkiego (gdzie było 0, jest teraz 1, gdzie było 1, jest teraz 0).

Kontynuując: dlaczego word &= 15 ustawia wszystkie oprócz 4 prawych bitów na 0? Powinieneś być w stanie to rozgryźć...

     n          =>  abcdefghjikl
  & 15          =>  000000001111
------            --------------
     ?              00000000jikl

(0 AND a = 0, 0 AND b = 0, ... j AND 1 = j, i AND 1 = i, ...)

Jak to jest przydatne? W wielu językach używamy rzeczy zwanych "bitmaskami". Maska bitowa to zasadniczo liczba to oznacza całą masę mniejszych liczb połączonych razem. Możemy łączyć liczby używając OR, i rozkładać je używając AND. Na przykład:

int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;

Jeśli mam tylko mapę i kapelusz, mogę to wyrazić jako myInventoryBitmask = (MagicMap | MagicHat), a rezultatem jest moja maska bitowa. Jeśli nic nie mam, to moja maska bitowa wynosi 0. Jeśli chcę zobaczyć, czy mam swoją różdżkę, to mogę zrobić:

int hasWand = (myInventoryBitmask & MagicWand);
if (hasWand > 0) {
  printf("I have a wand\n");
} else {
  printf("I don't have a wand\n");
}
Rozumiesz?

EDIT: more stuff

Spotkasz też operatora "bitshift": >. Oznacza to po prostu "przesuń wszystko w lewo N bitów" lub "przesuń wszystko w prawo n bitów".

Innymi słowy:

1 << 3 = 0001 << 3 = 0001000 = 8

I:

8 >> 2 = 01000 >> 2 = 010 = 2

 144
Author: Dave DeLong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-02 16:23:54

"Bit" to skrót od "cyfra binarna". I tak, to 0 LUB 1. Prawie zawsze jest 8 w bajcie i są one napisane tak, jak liczby dziesiętne -- z najważniejszą cyfrą po lewej, a najmniej znaczącą po prawej.

W twoim przykładzie w1 & 3 maskuje wszystko oprócz dwóch najmniej znaczących (prawych) cyfr, ponieważ 3, w binarnym, jest 00000011. (2 + 1) Operacja AND zwraca 0, jeśli któryś z bitów jest ANDed wynosi 0, więc wszystko oprócz dwóch ostatnich bitów jest automatycznie 0.

 2
Author: cHao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-06 20:41:12
w1 =    ????...??ab
3  =    0000...0011
--------------------
&  =    0000...00ab

0 & dowolny bit N = 0

1 & Dowolny bit N = N

Więc wszystko, co bitowe i 3 ma wszystkie swoje bity z wyjątkiem dwóch ostatnich ustawionych na 0. Dwa ostatnie bity, a i b w tym przypadku, są zachowane.

 1
Author: insipid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-06 20:54:06

@cHao & all: No! bity nie są liczbami. Nie są zerem ani jedynką!

Cóż, 0 i 1 są możliwymi i ważnymi interpretacjami. Zero i Jedynka to typowa interpretacja.

Ale bit jest tylko rzeczą, reprezentującą prostą alternatywę. Mówi "Jest" lub "nie jest". Nie mówi nic o tym, o tym "tym", o sobie. Nie mówi, co to jest.

W większości przypadków nie będzie Ci to przeszkadzać. Można je wziąć za liczby (lub części, cyfry, z numbers) jak ty (lub kombinacja języków programowania, procesora i innego sprzętu, wiesz jako" typowy") usaly - i może nigdy nie będziesz miał z nimi problemów.

Ale nie ma głównego problemu, jeśli zmienisz znaczenie " 0 " i "1". Ok, jeśli robiąc to podczas programowania asemblera, okaże się to trochę problematyczne, ponieważ niektóre mnemotechniki będą robić inne logiki, a następnie powiedzą ci z ich nazwami, liczby będą negowane i takie rzeczy.

Zobacz http://webdocs.cs.ualberta.ca/~amaral/courses/329/webslides/Topic2-DeMorganLaws/sld017.htm{[16]jeśli chcesz.

Pozdrowienia

 1
Author: Objective Interested Person,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-07 18:58:28