Grupy krwi - operacje bitowe

0

Cześć mam problem z tym zadaniem:

Załóżmy, że grupy krwi kodowane są bitowo w następujący sposób
A+ = 101, AB- = 110, 0+ = 001, B- = 010, itd.
Napisz program, który wykorzystując operacje bitowe dla zadanej grupy krwi wyznaczy
wszystkie grupy krwi, których posiadacz może byd dawcą dla posiadacza grupy zadanej.
Program powinien wczytywad i wypisywad dane w formacie tekstowym a pamiętać
i przetwarzać w formie bitowej.

Tabela grup krwi:
http://speedy.sh/cCqtJ/zad.pdf

Otóż nie widzę powiązania między kodami bitowymi, a grupami krwi. Widzę, że są one
numerowane od 0 do 7 patrząc od lewej po nagłówku w tabeli ale nic poza tym.

0

Otóż nie widzę powiązania między kodami bitowymi, a grupami krwi.

Dla mnie to wygląda na coś w rodzaju:
czy A + czy B + czy z plusem

Np.:
A+ = 101
czy A = 1
czy B = 0
czy z plusem = 1

B- = 010
czy A = 0
czy B = 1
czy z plusem = 0

itd.

Btw,
Zdanie:

to zadanie zostanie sprawdzone pod kontem wykorzystania operacji bitowych

Nie ma sensu, bo konto to coś innego, niż kąt.

1

Nudziło mi się, a zadanie mi się spodobało.

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

bool qualifies(int donor_idx, int recipient_idx)
{
    return (~(donor_idx & ~recipient_idx) & 7) == 7;
}

int main()
{
    const size_t count = 8;
    string types[count] = { "0-", "0+", "B-", "B+", "A-", "A+", "AB-", "AB+" };

    string donor;
    cout << "Dawca: ";
    cin >> donor;

    size_t donor_idx = find(types, types + count, donor) - types;
    if(donor_idx >= count)
        cout << "Nie ma takiej grupy";
    else
    {
        cout << "Biorcy:";

        for(int recipient_idx = 0; recipient_idx < count; recipient_idx++)
            if(qualifies(donor_idx, recipient_idx))
                cout << "\n" << types[recipient_idx];
    }

    cout << "\n";
}
0
size_t donor_idx = count - distance(find(types, types + count, donor), types + count);

da ten sam wynik co:size_t donor_idx=find(types,types+count,donor)-types;

Czemu tak zrobiłeś?

qualifies wg mnie powinno zwracać
```cpp
return recipient_idx|donor_idx==recipient_idx;
0
Rev napisał(a):

Natomiast nie zgadzam się co do samego wyrażenia.
A możesz się nie zgadazac, grunt że wikipedia się ze mną zgadza.

#include <iomanip>
#include <iostream>
using namespace std;
 
int main()
  {
   const char *types[]={"0Rh-", "0Rh+", "BRh-", "BRh+", "ARh-", "ARh+", "ABRh-", "ABRh+" };
   const size_t count=sizeof(types)/sizeof(*types);
   cout<<setw(6)<<"D.\B.";
   for(size_t x=0;x<count;++x) cout<<setw(6)<<types[x];
   cout<<endl;
   for(size_t y=count-1;y<count;--y)
     {
      cout<<setw(6)<<types[y];
      for(size_t x=0;x<count;++x)
        {
         cout<<setw(3)<<(((y|x)==y)?'X':' ')<<"   ";
        }
      cout<<endl;
     }
   return 0;
  }
0

Ah, przy zamienionej kolejności faktycznie będzie poprawnie.

ps. zbanowani użytkownicy głosu nie mają :>.

0

Nawiasów brakowało: return (recipient_idx | donor_idx) == recipient_idx;. Ale jest ok, przekombinowałem. Wychodziłem niepotrzebnie od całej tabelki prawdy zamiast zauważyć prostą zależność.

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