Ads_700x200

tme

wtorek, 9 października 2012

ROR & ROL'owanie bitów - wersja wojskowa

Witam,

W związku ze sporą ilością pytań jakie dostaję co jakiś czas na maila, chciałbym pokazać sposób w jaki można dokonywać tzw "ROL'owania" bitów w ramach jednego bajtu lub słowa, w najprostszy sposób w języku C. Naturalnie dodam, że nie chodzi tutaj o zwykłe przesuwanie bitów w prawo lub lewo, ponieważ wtedy wsuwają się nam zera od prawej lub lewej. Mam tu na myśli rolowanie, czyli jeśli np bajt przewijamy w lewo to najstarszy bit, który niejako wypada z bajtu, trafia z powrotem do niego ale na pozycję najmłodszego bitu. Co ma z tym wspólnego wersja wojskowa ? ;) widzicie te pagony odpowiadające randze starszego sierżanta ? .... jak za chwilę się przekonasz, wzrokowo mają one sporo wspólnego z prezentowanym kodem źródłowym. Nadmienię od razu, że w samym asemblerze można o kilka bajtów odchudzić kod, w porównaniu do tego, który zostanie wygenerowany przez kompilator C, ale komu by się chciało bawić wciąż we wstawki asemblerowe mając do dyspozycji wygodny C a tym bardziej z tak błahego powodu ...




Spójrzmy zatem jak może wyglądać rolowanie w ramach jednego bajtu:

**** wersja ROL 8-bit czyli przewijanie (rolowanie) w LEWO ****

**** wersja ROR 8-bit czyli przewijanie (rolowanie) w PRAWO ****
;
Jak widzisz zmiana kierunku przewijania wiąże się jedynie z odwróceniem pagonów wojskowych, popularnie mówiąc "zamiana sierżantów" ;) .... pewnie już wiesz jak dokonać tego z liczbami 16-bitowymi i większymi ? ... nie ? to spójrz pokażę jeszcze jeden przykład a następne już sobie na pewno sam napiszesz na tej podstawie.


**** wersja ROL 16-bit czyli przewijanie (rolowanie) w LEWO ****

teraz już chyba wszystko jasne ? .... to życzę miłej zabawy, taka prosta rzecz a przydaje się do tworzenia wielu ciekawych efektów szczególnie gdy np manipulujemy łańucszkami diod LED itp

13 komentarzy:

  1. drobna literówka do poprawy:
    "jeśli np bajt przewijamy w lewo to najstarszy bajt, który niejako wypada z bajtu"
    "jeśli np bajt przewijamy w lewo to najstarszy BIT, który niejako wypada z bajtu"

    OdpowiedzUsuń
  2. tak, oczywiście - dzięki już poprawione.

    OdpowiedzUsuń
  3. zakładam, że te "paragony" to tak dla śmiechu. Ja miałem pagony..

    OdpowiedzUsuń
    Odpowiedzi
    1. hahahahaha ale bzdurę napisałem ;) .... a jak pisałem to aż mi coś nie pasowało. Ja w prawdzie w wojsku nie byłem - może dlatego ? .... i teraz nawet nie wiem czy to zmieniać ;) .... ale chyba zmienię ... No bzdura, dzięki za zwrócenie uwagi - za szybko pisałem chyba. A teraz do dopiero mam śmiech.

      Usuń
  4. Panie Mirku, a czy można przesuwać od razu o kilka bitów dany bajt pisząc coś takiego:
    bajt = (bajt<<3) | (bajt>>5)

    OdpowiedzUsuń
    Odpowiedzi
    1. No a czemu by nie można ? ;) wszystko zależy jaki masz cel

      Usuń
  5. Do wcześniejszego pytania: sprawdziłem to sam, okazuje się że nie ma problemu, żeby przesunąć słowo o konkretną ilość bitów, ale dra potwierdzenia proszę o Pana 'potwierdzenie' (mało maślane)

    OdpowiedzUsuń
  6. Dlaczego w tekście nie ma żadnego kodu? W jednym z poradników tutaj na stronie widać kod, a ja tu widzę tylko napis:
    "**** wersja ROL 8-bit czyli przewijanie (rolowanie) w LEWO ****
    **** wersja ROR 8-bit czyli przewijanie (rolowanie) w PRAWO ****"

    OdpowiedzUsuń
    Odpowiedzi
    1. Sorki, wyłączył mi się plugin do pokazywania kodów źródłowych, już naprawiłem i powinno być widoczne

      Usuń
  7. A jeśli chcę rolować o pewną liczbę bitów wyliczoną wcześniej z równania, to już to nie działa - sprawdzałem. Wpisywanie konkretnych wartości działa, ale wstawienie tam zmiennej z wyliczoną wcześniej wartością - już nie, szkoda.

    OdpowiedzUsuń
  8. Już działa! Niechcący wziąłem zmienną służącą do innych obliczeń. Po użyciu nowej zmiennej do rollowania, program zadziałał. Można wstawiać wartości w zmiennych obliczonych wcześniej z równania. Sorki, jeśli komuś sprawiło to kłopoty.

    OdpowiedzUsuń
  9. A czy istnieje jakaś nieskomplikowana funkcja, przesuwająca środki z jednego ROR na inny ?

    OdpowiedzUsuń