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
drobna literówka do poprawy:
OdpowiedzUsuń"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"
tak, oczywiście - dzięki już poprawione.
OdpowiedzUsuńzakładam, że te "paragony" to tak dla śmiechu. Ja miałem pagony..
OdpowiedzUsuń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ńPanie Mirku, a czy można przesuwać od razu o kilka bitów dany bajt pisząc coś takiego:
OdpowiedzUsuńbajt = (bajt<<3) | (bajt>>5)
No a czemu by nie można ? ;) wszystko zależy jaki masz cel
Usuń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ńDlaczego w tekście nie ma żadnego kodu? W jednym z poradników tutaj na stronie widać kod, a ja tu widzę tylko napis:
OdpowiedzUsuń"**** wersja ROL 8-bit czyli przewijanie (rolowanie) w LEWO ****
**** wersja ROR 8-bit czyli przewijanie (rolowanie) w PRAWO ****"
Sorki, wyłączył mi się plugin do pokazywania kodów źródłowych, już naprawiłem i powinno być widoczne
Usuń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ń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ńa długi ROR z przesunięciem?
OdpowiedzUsuńdługi ROR z przesunięciem bitów
A dlaczego jest zakres od 1 do 7 w rolowaniu, a nie od 0 do 7?
OdpowiedzUsuńA kto ci powiedział że jest taki zakres o 1 do 7 ?
Usuń