Pytanie Czy kiedykolwiek musiałeś używać przesunięcia bitów w prawdziwych projektach?


Czy kiedykolwiek musiałeś użyć zmiana bitu w prawdziwych projektach programistycznych? Większość (jeśli nie wszystkie) języki wysokiego poziomu mają w sobie operatorów zmian, ale kiedy naprawdę trzeba ich używać?


76


pochodzenie




Odpowiedzi:


Nadal piszę kod dla systemów, które nie mają obsługi zmiennoprzecinkowej w sprzęcie. W tych systemach trzeba przesuwać bit do prawie wszystkich swoich arytmetyki.

Potrzebne są również zmiany w generowaniu skrótów. Arytmetyka wielomianowa (CRC, Reed-Solomon Codes są głównymi aplikacjami) lub używa przesunięć.

Jednak zmiany są po prostu używane, ponieważ są poręczne i wyrażają dokładnie to, co zamierzał autor. Możesz emulować wszystkie przesunięcia bitów za pomocą mnożenia, jeśli chcesz, ale byłoby to trudniejsze do napisania, mniej czytelne, a czasem wolniejsze.

Kompilatory wykrywają przypadki, w których mnożenie może zostać zredukowane do zmiany.


49





Tak, użyłem ich wiele razy. Oszustwo bitowe jest ważne na sprzęcie wbudowanym, gdzie maski bitowe są bardzo powszechne. Jest to również ważne w programowaniu gier, kiedy potrzebujesz co najmniej odrobiny wydajności.

Edytować: Używam ich również do manipulowania bitmapami, na przykład zmieniając głębię kolorów lub konwertując RGB <-> BGR.


35



Oddany. Zajmuję się programowaniem wbudowanym, a przełączanie bitów jest często wykonywane. - e.James
Konwersje RGB <-> BGR tutaj. - Neil N


  • Tworzenie ładnych wartości flag dla wyliczeń (zamiast ręcznego wpisywania 1, 2, 4 ...)
  • Rozpakowywanie danych z pól bitowych (korzysta z nich wiele protokołów sieciowych)
  • Przebieg krzywa-Z
  • Hacki wydajności

I nie mogę myśleć o wielu przypadkach, kiedy są używane. Zwykle jest inaczej - jest pewien specyficzny problem i okazuje się, że zastosowanie operacji bitowych da najlepsze wyniki (zwykle pod względem wydajności - czasu i / lub przestrzeni).


24



Możesz potrzebować go do przechowywania na przykład dwóch shorts w jednym intPole eger w stanie Session w ASP.net bez konieczności czytania i blokowania sesji, aby odczytać dwie oddzielne wartości. Również narzut pamięci przechowywania dwóch wartości w sesji jest zapisywany. - David d C e Freitas


Jedno miejsce, w którym je cały czas używam, to transponowanie liczby całkowitej dla aplikacji wieloplatformowych. Czasami przydają się (wraz z innymi operatorami manipulacji bitami) podczas blending grafiki 2D.


14



Oddelegowany, pisząc konwerter dla zestawu znaków EBCDIC. Niestety, to naprawdę robi niskopoziomowe prace w języku wysokiego poziomu, ale jest to konieczne w niektórych przypadkach. - Michael Meadows


Używałem ich kilka razy, ale prawie zawsze do parsowania formatu pliku binarnego.


8





Rozsądny artykuł tutaj: http://greatjustice.info/the-lost-art-art-bitmasks/


6



ten link daje teraz 404 - Bryan Oakley
nadal możesz uzyskać do niego dostęp tutaj: web.archive.org/web/20090406021150/http://greatjustice.info/... - Software Guy


Przesunięcia bitów są szybkie. Zostały one zaimplementowane w zestawach instrukcji CPU na długo przed podziałem i działaniami modułu. Wielu z nas używało przesunięć bitowych dla arytmetyki, która jest prosta na ołówku i papierze, ale nie jest dostępna na naszych procesorach.

Na przykład:

  • Użyłem przesunięć bitowych dla projektów obejmujące faktoring dużych kompozytów w ich czynniki pierwsze.
  • Użyłem również przesunięć bitowych dla znalezienie pierwiastka kwadratowego i sześcianu z dowolnie duże liczby całkowite.

6



czy możesz napisać przykład, jak z niego korzystać, aby znaleźć kostkę lub pierwiastek kwadratowy? Trochę nie rozumiem, jak można to zrobić. - Xsmael


Tak, wciąż jest potrzebne.

Tutaj na przykład w mojej pracy opracowujemy oprogramowanie do komunikacji ze sterownikiem PLC poprzez port szeregowy COMx. Konieczne jest obsłużenie bitów w bajcie, operatory shift lewo / prawo i logiczne OR, XOR, AND w dzień po dniu.

Na przykład załóżmy, że musimy włączyć bit 3 (od prawej do lewej) bajtu:

Jest o wiele bardziej wydajne:

Byte B;

B := B XOR 4;

Zamiast:

Byte B = 0;
String s;  // 0 based index

s = ConvertToBinary (B);
s[5] = "1";
B := ConvertToDecimal (s);

Pozdrowienia.


5



Możesz chcieć dodać, dlaczego 4 odnosi się do bitu 3 (od prawej do lewej) - HCP
Dlaczego s [5]? Czy nie powinien to być S [2]? - IamIC
B: = B XOR 4; W takim przypadku, aby włączyć konkretny bit, czy nie powinno to być po prostu OR? Czy XOR nie jest używany do przełączania? stackoverflow.com/questions/47981/... - Hari


Kiedy pisałem w asemblerze, mój kod był pełen przesuwania i maskowania.

Czy to też była spora kwota w C?

Nie zrobiłem tego zbyt wiele w językach JavaScript lub serwerowych.

Prawdopodobnie najlepszym współczesnym zastosowaniem jest przejście przez spakowaną tablicę wartości boolowskich przedstawionych jako zer i jedynek. Kiedyś zawsze opuszczałem przesunięcie i sprawdzałem bit znaku w zespole, ale w językach wyższego poziomu porównywane są wartości.

Na przykład, jeśli masz 8 bitów, sprawdź górny bit za pomocą "if (a> 127) {...}". Następnie opuściłeś przesunięcie (lub pomnożenie przez 2), zrób "i" używając 127 (lub odejmuj 256, jeśli został ustawiony ostatni bit), i zrób to ponownie.


4





Używałem ich dużo w kompresji / dekompresji obrazu, gdzie bity bitmapy zostały skompresowane. Za pomocą http://en.wikipedia.org/wiki/Huffman_coding kompresowane elementy składają się z różnej liczby bitów (nie są wyrównane do wszystkich bajtów), dlatego trzeba je przesuwać bitowo, gdy je kodujesz lub dekodujesz.


3