Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C/C++] Połączenie 5-ciu bajtów w 1 (OR)

Kubbaz 24 Mar 2011 10:28 984 5
  • #1 24 Mar 2011 10:28
    Kubbaz
    Poziom 26  

    Witam wszystkich Elektrodowiczów!

    Mam pięć bajtów:

    Code:
    unsigned char up, down, left, right, select;
    

    up     = 0000 0001;
    down   = 0000 0001;
    left   = 0000 0001;
    right  = 0000 0001;
    select = 0000 0001;


    W czasie działania programu wszystkie zmienne mogą przyjmować wartość tylko 0000 0001 lub 0000 0000. Aby informacje o tym, czy dana zmienna jest ustawiona (0000 0001) czy też nie (0000 0000), chciałbym przechowywać je w jednej zmiennej unsigned char stan w konwencji jak poniżej:

    unsigned char stan = (b7->)0000 0000(<-b0);

    b0 - up
    b1 - down
    b2 - left
    b3 - right
    b4 - select

    I w zależności od stanu danej zmiennej (up, down, left, right, select), będzie się zmieniała tylko pozycja "jedynki" w zmiennej unsigned char stan, co znacznie ułatwi mi sprawę dalej obróbki danych w moim programie.

    Z tego co wiem to połączenie tych zmiennych w jedną powinno być mniej więcej tak:
    Code:

    stan = ((up) && (down<<1) && (left<<2) && (right<<3) && (select<<4));


    Gdzie każda z kolejnych zmiennych będzie miała przesuniętą "jedynkę" o 1, 2, 3 lub 4 bity w lewo.

    Jednakże coś to rozwiązanie nie działa. Proszę o pomoc w tej sprawie.

    0 5
  • #2 24 Mar 2011 10:45
    pieczki
    Poziom 11  

    Kubbaz napisał:
    Witam wszystkich Elektrodowiczów!

    Mam pięć bajtów:

    Code:
    unsigned char up, down, left, right, select;
    

    up     = 0000 0001;
    down   = 0000 0001;
    left   = 0000 0001;
    right  = 0000 0001;
    select = 0000 0001;


    W czasie działania programu wszystkie zmienne mogą przyjmować wartość tylko 0000 0001 lub 0000 0000. Aby informacje o tym, czy dana zmienna jest ustawiona (0000 0001) czy też nie (0000 0000), chciałbym przechowywać je w jednej zmiennej unsigned char stan w konwencji jak poniżej:

    unsigned char stan = (b7->)0000 0000(<-b0);

    b0 - up
    b1 - down
    b2 - left
    b3 - right
    b4 - select

    I w zależności od stanu danej zmiennej (up, down, left, right, select), będzie się zmieniała tylko pozycja "jedynki" w zmiennej unsigned char stan, co znacznie ułatwi mi sprawę dalej obróbki danych w moim programie.

    Z tego co wiem to połączenie tych zmiennych w jedną powinno być mniej więcej tak:
    Code:

    stan = ((up) && (down<<1) && (left<<2) && (right<<3) && (select<<4));


    Gdzie każda z kolejnych zmiennych będzie miała przesuniętą "jedynkę" o 1, 2, 3 lub 4 bity w lewo.

    Jednakże coś to rozwiązanie nie działa. Proszę o pomoc w tej sprawie.



    Witam!
    tak nie będzie Ci działać. Przesuwając bity w każdym bajcie powodujesz, że wygląda to tak:

    up = 0000 0001
    down = 0000 0010
    left = 0000 0100
    right = 0000 1000
    select = 0001 0000

    a robiąc AND na tych wszystkich bajtach wychodzi Ci 0000 0000.
    Więc powinieneś dać OR
    czyli powinno wyglądać to tak

    Code:

    stan = ((up) || (down<<1) || (left<<2) || (right<<3) || (select<<4));


    Pozdrawiam

    0
  • Pomocny post
    #3 24 Mar 2011 10:49
    piotr_go
    Poziom 27  

    Nie działa bo dajesz 2 "endy". Powinno być jedno "lub".

    Code:
    stan = ((up) | (down<<1) | (left<<2) | (right<<3) | (select<<4));

    0
  • Pomocny post
    #4 24 Mar 2011 10:51
    al777
    Poziom 26  

    Chciałbym również zwrócić uwagę szanownych kolegów, że operator logiczny OR (||) różni się w działaniu od operatora sumy bitowej OR (|).
    Przynajmniej jak ostatnio sprawdzałem, tak było :D .
    Ta podpowiedź powinna wam wystarczyć.

    [edit]
    Ups, kolega już mnie uprzedził i podał jak ma być.

    0
  • Pomocny post
    #5 24 Mar 2011 10:51
    pieczki
    Poziom 11  

    zgadza się - trochę się zagalopowałem - powinno być jedno "|".

    0