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++

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:
operator przesuwania bitów << lub >> w c++

Postautor: Sławek5 » 19 paź 2005, o 05:32

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.

radzio
Moderator
Moderator
Posty:967
Rejestracja:13 maja 2003, o 10:33
Lokalizacja:Sosnowiec
Kontaktowanie:

Postautor: radzio » 19 paź 2005, o 05:47

Język C nie posiada instrukcji rotacji. Najlepszym rozwiązaniem byłaby wstawka asemblerowa. Ewentualnie można spróbować napisać odpowiednią funkcję w C, ale wstawka będzie mniejsza.

sta
-
-
Posty:1
Rejestracja:26 lis 2005, o 20:17
Lokalizacja:warszawa

Postautor: sta » 26 lis 2005, o 20:36

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;

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 26 lis 2005, o 21:01

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

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości