Napisałem taki program, który ma zapisać mi 2 daty (ograniczone warunkami, które podam za chwilę) w postaci jednej zmiennej:
-Lata tylko z XXI wieku-od 2000 do 2127 tak by można je reprezentować tylko liczbami [0,127]
-dalej normalnie-dla miesięcy 4 bity(można tak zapisać liczby [0,15])
-no i dni [0,31] a wiec 5 bitów
razem dla jednej daty:16 bitów ale, że mają być 2 to 32 bity.
Wiem, że int jest najczęściej 32 bitowy jednak już dla porządku dałem wszędzie int32_t (wiem może za duże, jak kilka osób mi sugerowało jednak na razie chce żeby wszystko działało)
no i potem przesuwam sobie te bity i chciałem sobie wyświetlić liczbę, której odpowiada układ bitów jaki uzyskałem (wyświetlam oczywiście w "main") - wyszło mi -25233793 wpisałem sobie to do kalkulatora żeby przeliczyło mi na system dwójkowy (o ten ... _liczb.php kalkulator). Wyszła mi liczba która ma +/- 64 bity no ale jak sobie biorę od prawej 32 to niby się zgadza... a te złe to chyba wszystkie 1...tylko:
1. skąd wzięły mi się te jedynki?
2.Czy to w ogóle ma prawo działać poprawnie?(proszę bardzo tylko o odpowiedź na to-na razie chce TYLKO żeby działało..."szczegółami" (takimi jak to, że typy parametrów są "za duże" mogę zająć się później))
Proszę o jakieś wskazówki jak taki problem rozwiązać... Przepraszam, że się aż tak rozpisałem ale chciałbym uzyskać dosyć precyzyjną odpowiedź/podpowiedź. A i dodam, że jestem POCZĄTKUJĄCY dlatego błąd może wynikać też z tego, że niezbyt dobrze mogłem poznać system dwójkowy czy sam temat operatorów bitowych.
Kod:
Kod: Zaznacz cały
#include <iostream>
#include <iomanip>
using namespace std;
int32_t pack(int32_t rr1, int32_t mm1, int32_t dd1, int32_t rr2, int32_t mm2, int32_t dd2);
int main()
{
int32_t peroid=pack(2126,12,31,2127,12,30);
cout<<peroid<<endl;
return 0;
}
int32_t pack(int32_t rr1, int32_t mm1, int32_t dd1, int32_t rr2, int32_t mm2, int32_t dd2)
{
int32_t zwracamy;
rr1-=2000;
rr2-=2000;
dd1=dd1<<27;
mm1=mm1<<23;
rr1=rr1<<16;
dd2=dd2<<11;
mm2=mm2<<7;
zwracamy=rr1|rr2|dd1|mm1|dd2|mm2|rr2;
return zwracamy;
}
Z góry bardzo dziękuję za podpowiedzi oraz za cierpliwość do mojego ułomnego opisu!!!