michal_musial Temat założony przez niniejszego użytkownika |
operatory bitowe » 2013-11-11 18:59:40 Program ma za zadanie "upchanie" danych w jednej zmiennej short(funkcja val)oraz ich wydrukowanie(funkcja druk) w postaci: plec: 0 stan cywilny : 3 grupa wiekowa: 2 itd... Nie wiem jak wydrukować wyżej przedstawioną postać za pomocą operatorów bitowych. Czy ma ktoś pomysł jak osiągnąć taki efekt? #include <iostream> using namespace std;
unsigned short val( int plec, int stan_cyw, int grupa_wiek, int edu, int zam, int region, int odp ) { unsigned short kod = 0; kod = plec; kod <<= 2; kod |= stan_cyw; kod <<= 2; kod |= grupa_wiek; kod <<= 2; kod |= edu; kod <<= 2; kod |= zam; kod <<= 4; kod |= region; kod <<= 3; kod |= odp; cout << plec << stan_cyw << grupa_wiek << edu << zam << region << odp << "\n"; return kod; } void info( unsigned short kod ) { cout << kod << "\n\n\n\n\n\n"; int bits = 8 * sizeof( kod ); unsigned short mask = 1 <<( bits - 1 ); for( int i = 0; i < bits; i++ ) { cout <<( kod & mask ? 1: 0 ); mask >>= 1; } cout << endl; }
int main() { int plec = 0, stan_cyw = 0, grupa_wiek = 0, edu = 0, zam = 0, region = 0, odp = 0; cout << "Plec: \nKobieta: 0, \nMezczyzna: 1" << endl; cin >> plec; cout << "\nStan cywilny: \npanna/kawaler: 0 \nmezatka/zonaty: 1 \nrozwodka/rozwodnik: 2 \nwdowa/wdowiec: 3" << endl; cin >> stan_cyw; cout << "\nWiek: \n18-30: 0 \n31-45:1 \n46-60: 2 \n60+: 3\n"; cin >> grupa_wiek; cout << "\nWyksztalcenie: \npodstawowe: 0 \nsrednie: 1 \nlicencjat: 2 \nmagister: 3" << endl; cin >> edu; cout << "\nMiesce zamieszkania: \nwies: 0 \nmiasto do 50 tys.: 1 \nmiasto 50-400 tys.: 2 \nmiasto ponad 400 tys.: 3" << endl; cin >> zam; cout << "\nRegion kraju(0-15): \nwoj. dolnoslaskie: 0 \nwoj. kujawsko-pomorskie: 1 \nwoj. lubelskie:2 \nwoj. lubuskie: 3 \nwoj. lodzkie: 4" " \nwoj. malopolskie: 5 \nwoj. mazowieckie: 6 \nwoj. opolskie: 7 \nwoj. podkarpackie: 8 \nwoj. podlaskie:9 \nwoj. pomorskie: 10" " \nwoj. slaskie: 11 \nwoj. swietokrzyskie: 12 \nwoj. warminsko-mazurskie: 13 \nwoj. wielkopolskie: 14 \nwoj. zachodniopomorskie: 15" << endl; cin >> region; cout << "\nUlubiony kolor: \nzielony: 0 \nniebieski: 1 \nczerwony: 2 \nzolty: 3 \nfiolet: 4 \nczarny: 5 \nbialy: 6 \ninny: 7" << endl; cin >> odp; unsigned short kod = val( plec, stan_cyw, grupa_wiek, edu, zam, region, odp ); info( kod ); return 0; }
|
|
pekfos |
» 2013-11-11 19:08:56 Tak samo jak zapisujesz, tylko odwrotnie. W odwrotnej kolejności, przesuwaj w przeciwnym kierunku i zamiast alternatywy używaj koniunkcji. |
|
michal_musial Temat założony przez niniejszego użytkownika |
» 2013-11-11 19:43:35 Dziękuję za odpowiedź. Jeżeli dobrze Cię zrozumiałem to chodzi o to: int odp &= kod; kod >>= 3; int region &= kod; kod >>= 4; itd....
W upychaniu danych używałem alternatywy do zapisania informacji w zmiennej, teraz koniunkcja wg mnie nie pomoże, ponieważ poza danymi dotyczącymi jednej liczy jeszcze mam "ogon" w postaci pozostałych liczb... Czy poprawne byłoby użycie takiego sposobu?: kod <<= 13; kod >>= 13; odp = kod;
teraz wyłuskamy liczbę dotycząca odpowiedzi, co jednak z pozostałymi liczbami? czy takie rozwiązanie byłoby poprawne? poprawcie mnie jeśli się mylę. |
|
pekfos |
» 2013-11-11 19:46:05 Wiesz, co robi koniunkcja? |
|
michal_musial Temat założony przez niniejszego użytkownika |
» 2013-11-11 19:51:39 Wyrzuca jedynkę przy porównywaniu jedynek, w innych wypadkach 0. Tylko jak użyć koniunkcji skoro poszczególne liczby zapisane są na 2,3 lub 4 bitach składających się na tą zmienną? |
|
pekfos |
» 2013-11-11 20:28:59 Normalnie? Z alternatywą jakoś sobie poradziłeś.. short x = 0x1234; std::cout <<( x & 0xF ); |
|
michal_musial Temat założony przez niniejszego użytkownika |
» 2013-11-11 21:22:32 Już ogarniam, zamykam temat. Dzięki za pomoc. |
|
« 1 » |