Myślę, że druga część pytania:
Do czego służą operatory bitowe? Byłbym wdzięczny za kilka przykładów.
Został tylko częściowo rozwiązany. To są moje dwa centy w tej sprawie.
Operacje bitowe w językach programowania odgrywają podstawową rolę w przypadku wielu aplikacji. Prawie wszystkie obliczenia niskiego poziomu muszą być wykonywane przy użyciu tego rodzaju operacji.
We wszystkich aplikacjach, które wymagają przesyłania danych między dwoma węzłami, takich jak:
W warstwie komunikacji niższego poziomu dane są zwykle przesyłane w tzw . Ramkach . Ramki to po prostu ciągi bajtów przesyłane kanałem fizycznym. Te ramki zazwyczaj zawierają rzeczywiste dane oraz kilka innych pól (zakodowanych w bajtach), które są częścią tego, co nazywa się nagłówkiem . Nagłówek zwykle zawiera bajty, które kodują pewne informacje związane ze stanem komunikacji (np. Z flagami (bitami)), licznikami ramek, kodami korekcji i wykrywania błędów itp. Aby uzyskać przesyłane dane w ramce i zbudować ramki do wysyłania danych, na pewno będziesz potrzebować operacji bitowych.
Ogólnie rzecz biorąc, gdy mamy do czynienia z tego rodzaju aplikacjami, dostępne jest API, więc nie trzeba zajmować się wszystkimi tymi szczegółami. Na przykład wszystkie współczesne języki programowania udostępniają biblioteki do połączeń przez gniazdo, więc w rzeczywistości nie trzeba budować ramek komunikacyjnych TCP / IP. Ale pomyśl o dobrych ludziach, którzy zaprogramowali dla ciebie te interfejsy API, na pewno mieli do czynienia z konstrukcją ram; używanie wszelkiego rodzaju operacji bitowych do przechodzenia między komunikacją niskiego poziomu a komunikacją wyższego poziomu.
Jako konkretny przykład wyobraź sobie, że ktoś daje ci plik zawierający surowe dane, które zostały przechwycone bezpośrednio przez sprzęt telekomunikacyjny. W takim przypadku, aby znaleźć ramki, będziesz musiał odczytać surowe bajty w pliku i spróbować znaleźć jakieś słowa synchronizujące, skanując dane bit po bicie. Po zidentyfikowaniu słów synchronizujących będziesz musiał pobrać rzeczywiste ramki i PRZESUNIĄĆ je, jeśli to konieczne (a to dopiero początek historii), aby uzyskać rzeczywiste dane, które są przesyłane.
Inną bardzo odmienną rodziną aplikacji niskiego poziomu jest sytuacja, w której trzeba sterować sprzętem za pomocą (pewnego rodzaju starożytnych) portów, takich jak porty równoległe i szeregowe. Te porty są kontrolowane przez ustawienie niektórych bajtów, a każdy bit z tych bajtów ma określone znaczenie, jeśli chodzi o instrukcje, dla tego portu (patrz na przykład http://en.wikipedia.org/wiki/Parallel_port ). Jeśli chcesz zbudować oprogramowanie, które robi coś z tym sprzętem, będziesz potrzebować operacji bitowych, aby przetłumaczyć instrukcje, które chcesz wykonać, na bajty zrozumiałe dla portu.
Na przykład, jeśli masz kilka fizycznych przycisków podłączonych do portu równoległego, aby sterować innym urządzeniem, jest to wiersz kodu, który można znaleźć w aplikacji:
read = ((read ^ 0x80) >> 4) & 0x0f;
Mam nadzieję, że to się przyczyni.