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!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
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.
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.
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.
Pozdrowienia
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