Wiele odpowiedzi tutaj opisujące, co ta mechanika pozwala ci zrobić, ale nie dlaczego chcesz z niej skorzystać. Dlatego.
Krótka wersja:
Taki zapis pomaga podczas interakcji z innymi komponentami i komunikuje z innymi inżynierami, ponieważ mówi jawnie co nieco w słowie jest bycie zestaw lub jasne zamiast przesłaniając te informacje Wewnątrz wartość numeryczna.
Mogę do ciebie zadzwonić i powiedzieć "Hej, co to jest za otwarcie pliku ?" A ty powiedziałbyś "Bit 0". I napisałbym w moim kodzie open = 1 << 0
. Ponieważ numer po prawej stronie <<
informuje o numerze bitu.
.
Długa wersja:
Tradycyjnie bitów w słowie są numerowane od prawej do lewej, zaczynając od zera. Najmniej znaczącym bitem jest bit numer 0, a liczony jako najbardziej znaczący bit liczony jest w kierunku . Istnieje kilka benefits do oznaczania bitów w ten sposób .
Jedną z korzyści jest to, że można mówić o tym samym bicie niezależnie od rozmiaru słowa. Np. Mógłbym powiedzieć, że zarówno 32-bitowe słowo 0x384A, jak i 8-bitowe słowo 0x63, są ustawione bity 6 i 1. Jeśli policzyłeś swoje bity w przeciwnym kierunku, nie możesz tego zrobić.
Inną korzyścią jest to, że wartość bitu to po prostu 2 podniesione do potęgi pozycji bitowej . Na przykład binarny 0101
ma ustawione bity 2 i 0. Bit 2 ma wartość , a bit 0 ma wartość 1 (2^0). Tak więc wartość liczbowa wynosi oczywiście 4 + 1 = 5.
To długowieczne wyjaśnienie tła doprowadza nas do punktu: notacja <<
podaje numer bitu, po prostu patrząc na niego.
numer 1 samodzielnie w sprawozdaniu 1 << n
jest tylko jeden bit ustawiony w pozycji bit 0. Gdy przesunięcie że liczba lewo, jesteś w ruchu, które następnie ustawić trochę na innej pozycji w liczbie. Dogodnie, liczba przesunięć informuje o numerze bitu, który zostanie ustawiony.
1 << 5: This means bit 5. The value is 0x20.
1 << 12: This means bit 12. The value is 0x40000.
1 << 17: This means bit 17. The value is 0x1000000.
1 << 54: This means bit 54. The value is 0x40000000000000.
(You can probably see that this notation might be helpful if
you're defining bits in a 64-bit number)
Ten zapis naprawdę przydaje się, gdy jesteś interakcji z innym komponentem , jak odwzorowywanie bitów w słowie do rejestru sprzętowego. Podobnie jak Ty możesz mieć urządzenie, które włącza się podczas pisania na bit 7. Inżynier sprzętu napisałby arkusz danych, który mówi, że bit 7 włącza urządzenie. A ty napiszesz w swój kod ENABLE = 1 << 7
. To proste.
Och strzelać. Inżynier właśnie wysłał erratę do arkusza informacyjnego, mówiąc, że jest to bit 15, a nie bit 7. To jest OK, wystarczy zmienić kod na ENABLE = 1 << 15
.
Co jeśli ENABLE
było rzeczywiście, gdy oba bity 7 i 1 zostały ustawione w tym samym czasie?
ENABLE = (1 << 7) | (1 << 1)
.
Z początku może wyglądać dziwnie i tępo, ale przyzwyczaisz się do tego. I będziesz wdzięczny za to, jeśli kiedykolwiek wyraźnie będziesz potrzebował znać numer bitowy czegoś.
Nie wiem, kto głosuje, aby to zamknąć, ale nie jest to pytanie "oparte głównie na opiniach". Jest to techniczne pytanie, zadające konkretnie, jaki jest cel "<<" w tym scenariuszu. –
@GrantWinney (nie moje krótkie głosy), ale widzę, jak to jest "oparte na opiniach", ponieważ pytanie jest zasadniczo "dlaczego ktoś używa' 1 << 2', gdy '0x04' jest bardziej czytelny * dla mnie *". –
Nigdy nie powiedziałem, że 0x04 jest bardziej czytelny i nie porównałem obu. Intencją pytania jest zrozumienie skutków ubocznych tego stwierdzenia (= możliwość łączenia flag) – JSBach