Unie i pola bitowe - czy to dobrze działa?

0

Witam, mam takie zadanie:

Napisz prosty program który zapyta użytkownika o datę urodzenia w formie DDMMRRRR gdzie dd dzień mm miesiąc i rrrr rok
przyjąć datę jako wartość typu long

A następnie wypisać na ekranie w postaci dziesiątkowej następujące jej fragmenty

  • fragment o nazwie niebieskie na który składają się bity 0,1,2,3,4,5
    -fragment o nazwie zielony na który składają się bity od 10 do 14 (włącznie)
    -fragment o nazwie czerwony na który składają się bity 16,17,18

W programie nie można ani razu użyć operacji bitowej koniunkcji ani przesunięcia bitowego. Jeśli posłużysz się unia to niech NIE będzie ona anonimowa.

Rozwiązałem to w taki sposob:

 #include <iostream>
using namespace std;

struct tnij
{
   int niebieski :6;
            int   :3; //puste
    int zielony   :5;
            int   :1; // puste
    int czerwony  :3;
};

union kolory
{
   long cala;
   tnij date;
};



int main()
{

    long data;
    cout << "Podaj swoja date urodzenia (liczbowo) np 16041995 -> "; cin>>data;

    kolory dane;
    dane.cala = data;

    cout << "Niebieski: " << dane.date.niebieski << endl;
    cout << "Zielony: " << dane.date.zielony << endl;
    cout << "Czerwony " << dane.date.czerwony << endl;


}

Jest to dobre rozwiazanie?

0

A pytanie brzmi. Daje dokładnie to co chcesz uzyskać?

0

Właściwie to jeżeli dobrze rozumiem zdanie to tak..
możesz mi to wyjaśnić? Zrobiłem to wg. przykładu no ale nie jestem pewien.
Proszę pomóż:(

0

Weźmy np: 24 12 2011
Rozkładając binarnie zapis 24122011 wychodzi 1011100000001001010011011
Według twojego programu powinno być:
niebieski: 27
zielony: 9
czerwony: 0
więc bierzemy bity najbardziej wysunięte na prawo (bo od nich się zaczyna):
011011 w przeliczeniu na (10) system jest to: 025 + 12</sup>4 + 123 + 02</sup>2 + 121 + 12</sup>0 = 0 + 16 + 8 + 0 + 2 + 1 = 27
trzy bity odrzucamy kolejne są zatem:
01001 na dziesiętny: 024 + 12</sup>3 + 022 + 02</sup>1 + 1*2^0 = 0 + 8 + 0 + 0 + 1 = 9
opuszczamy jeden bit i wybieramy następne 3:
000 na dziesiętny: 022 + 02</sup>1 + 0*2^0 = 0 + 0 + 0 = 0

Z tego wynika, że program działa prawidłowo.

1

Dziekuje, MJay

1 użytkowników online, w tym zalogowanych: 0, gości: 1