[C++] rightrot(x,n)-bufor cyrkularny z przesunięciem w prawo

Xeres
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 7 sty 2009, o 09:49
Płeć: Mężczyzna
Lokalizacja: Podolsze
Podziękował: 1 raz

[C++] rightrot(x,n)-bufor cyrkularny z przesunięciem w prawo

Post autor: Xeres »

Mam na zadanie przygotować programy zwierające następujące funkcje:
- printbit(x) - wypisującą obraz bitowy danej liczby całkowitej x;
- setbits(x,p,n,y) – funkcja ta ma zwracać wartość x taką by n-bitów zaczynając od bitu
numer p było kopią n skrajnie prawych bitów y,
- invert(x,p,n) – funkcja ta ma zwracać wartość x taką by n-bitów zaczynając od bitu numer
p miało zmienioną wartość na przeciwną (z 1 na 0, z 0 na 1),
- rightrot(x,n) – bufor cyrkularny z przesunięciem w prawo. Funkcja ta ma zwrócić jako swą
wartość liczbę całkowitą bez znaku x po cyklicznym przesunięciu w prawo o n bitów.
Oznacza to, że „tracone” najmłodsze bity mają zostać wstawione na miejsce n najstarszych
bitów słowa x,
- leftrot(x,n) – bufor cyrkularny z przesunięciem w lewo. Funkcja ma działać tak jak rightrot
z tym, że przesunięcie ma być w lewo.

Zrobiłem pierwszy z nich (tj. printbit), tylko nie wiem czy w dobrze:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

void bin(int a);
int main ()
{
cout<<"Podaj liczbe calkowita : ";
int a;
cin>>a;
bin(a);
system ("pause");
}
void bin (int a)
{
int x=a % 2;
if (a > 1)
{
bin(a/2);
}
cout<<x<<"
";
}
a z pozostałych nie mam pojęcia jak zrobić :/, czy ktoś byłby w stanie pomóc ?
Ostatnio zmieniony 21 sty 2009, o 08:34 przez Xeres, łącznie zmieniany 1 raz.
Awatar użytkownika
wafello
Użytkownik
Użytkownik
Posty: 35
Rejestracja: 7 sty 2009, o 21:50
Płeć: Mężczyzna
Lokalizacja: Józefina
Pomógł: 6 razy

[C++] rightrot(x,n)-bufor cyrkularny z przesunięciem w prawo

Post autor: wafello »

Nie podam Ci gotowego rozwiązania ale podam coś co Ci na pewno pomoże:

1. aby otrzymać liczbę z jednym bitem 1 na pozycji n:

Kod: Zaznacz cały

   int i=1;
   i = i<<n;
2.co do invert: aby zamienic dowolny bit na przeciwny xorujesz go z 1

Kod: Zaznacz cały

   1000^1111 = 111
   111^111 =0
   1110101^0 = 1110101
(znak "^" to xorowanie)

3. żeby sprawdzić czy dany bit jest "zapalony" (czy wynosi 1) stosujesz operacje &

Kod: Zaznacz cały

   1111 &  100 = 1
   101 & 010 = 1
4. aby zapalić dany bit stosujesz operacje &&

Kod: Zaznacz cały

   101 && 10 = 111
   1000 && 11 = 1011
5. aby ustawić dany bit na odpowiedni znak najpierw go czyścisz a potem zapalasz go albo nie...
do czyszczenia przyda sie maska: (aby zgasić dany bit robisz && z maską która ma wszystkie bity 1 a jeden na 0)
Aby wykonać taką maskę tworzysz liczbę która będzie miała zapalony jeden bit i wykonujesz na niej operacje zaprzeczenia - !

Kod: Zaznacz cały

     !00001000 = 11110111
   
6. co do przesunięć - zapamiętujesz dwukrotnie tą liczbę - po czym na jednej robisz odpowiednią ilość przesunięć w prawo (>>) na drugiej w lewo (
Xeres
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 7 sty 2009, o 09:49
Płeć: Mężczyzna
Lokalizacja: Podolsze
Podziękował: 1 raz

[C++] rightrot(x,n)-bufor cyrkularny z przesunięciem w prawo

Post autor: Xeres »

Dzięki wielki już czaje oczywiście +
Xeres
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 7 sty 2009, o 09:49
Płeć: Mężczyzna
Lokalizacja: Podolsze
Podziękował: 1 raz

[C++] rightrot(x,n)-bufor cyrkularny z przesunięciem w prawo

Post autor: Xeres »

Jednak nie wiem jak zrobić to z rightrot:
- rightrot(x,n) – bufor cyrkularny z przesunięciem w prawo. Funkcja ta ma zwrócić jako swą
wartość liczbę całkowitą bez znaku x po cyklicznym przesunięciu w prawo o n bitów.
Oznacza to, że „tracone” najmłodsze bity mają zostać wstawione na miejsce n najstarszych
bitów słowa x,
Mógłby ktoś zrobić taki programik, bo nie mam bladego pojęcia teraz :/
Xitami

[C++] rightrot(x,n)-bufor cyrkularny z przesunięciem w prawo

Post autor: Xitami »

Kod: Zaznacz cały

uint rr1(uint x)
    return (x>>1) | (x<<31)

uint rr(x,n)
    for(i=1;i<=n
        x=rr1(x)
    return x
ODPOWIEDZ