Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

operatory bitowe

Ostatnio zmodyfikowano 2013-11-11 21:22
Autor Wiadomość
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?
C/C++
#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;
}
P-96064
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.
P-96066
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:

C/C++
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?:
C/C++
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ę.
P-96075
pekfos
» 2013-11-11 19:46:05
Wiesz, co robi koniunkcja?
P-96076
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ą?
P-96079
pekfos
» 2013-11-11 20:28:59
Normalnie? Z alternatywą jakoś sobie poradziłeś..
C/C++
short x = 0x1234;
std::cout <<( x & 0xF );
P-96086
michal_musial
Temat założony przez niniejszego użytkownika
» 2013-11-11 21:22:32
Już ogarniam, zamykam temat.
Dzięki za pomoc.
P-96092
« 1 »
  Strona 1 z 1