cześć.
W c++ jest operator przesuwający bity << lub >>. Ale przy przesuwaniu np << w lewo po prawej stronie dodaje 0, więc jesli mam 11111111 to po operacji <<1 dostanę 11111110.
A czy istnieje możliwość takiego przesuwania aby w miejsce bitu 0 poawiał się bit 7. Chodzi mi o rotację bitów.
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięoperator przesuwania bitów << lub >> w c++
Moderatorzy:Jacek Bogusz, Moderatorzy
wydaj mi się że drugi od góry post w temacie viewtopic.php?t=13532 może się przydać. Nie sprawdzałem ale powinno działać
------------
------------
unsigned int wyniczek = dana2*0x0100 + dana1;
lub
unsigned int wyniczek = dana2<<8 + dana1;
lub
unsigned int wyniczek = dana2*0x0100 | dana1;
lub
unsigned int wyniczek = dana2<<8 | dana1;
W C i C++ nie intnieje operator rotacji. Uniwersalne rozwiązanie to napisać własną funkcję. Ale w wielu kompilatorach istnieje wsparcie dla tej operacji. Realizowane jest jako funkcja zwracająca wynik rotacji. Poszukaj w opisie bibliotek lub funkcji wbudowanych w twój kompilator, często ich nazwy są zbliżone do nazwy odpowiedniej instrukcji assemblera coś jak _ror(), _rol(). Przy ich używaniu trzeba koniecznie zwrócić uwagę na typ danych wejściowych i rezultatu.
przykład funkcji w C
// rotacja bajtu w lewo
unsigned char rol( unsigned char Val )
{
if( 0x80 & Val ) // jeżeli bit(7) jest równy "1"
return ( (Val<<1) | 0x01 ); // trzeba "dodać" "zgubiony" bit = 1
return (Val<<1); // i tak na ostatnim bicie było "0"
}
albo tak
#define rol( Val ) ((Val&0x80)? 0x01| (Val<<1) : Val<<1 )
Za każdym razem używasz tego np tak:
bytedana = rol( bytedana ); // rotacja bajtu bytedana o jedna pozycje
przykład funkcji w C
// rotacja bajtu w lewo
unsigned char rol( unsigned char Val )
{
if( 0x80 & Val ) // jeżeli bit(7) jest równy "1"
return ( (Val<<1) | 0x01 ); // trzeba "dodać" "zgubiony" bit = 1
return (Val<<1); // i tak na ostatnim bicie było "0"
}
albo tak
#define rol( Val ) ((Val&0x80)? 0x01| (Val<<1) : Val<<1 )
Za każdym razem używasz tego np tak:
bytedana = rol( bytedana ); // rotacja bajtu bytedana o jedna pozycje
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości