logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c] jak rozebrać Bajt w hex na bity?

hessuss 29 Maj 2009 19:24 4303 9
REKLAMA
  • #1 6590975
    hessuss
    Poziom 13  
    Witajcie.
    Od kilku dni wziąłem się za atmegę w WinAVR bo jak zobaczyłem różnicę w wielkości generowanego kodu to jedyne słuszne podejście :)
    Mam taki problem.
    W tablicy są zmienne w formie Hex czyli nap 0xFE
    chcę przesłać tą wartość do rejestru przesuwnego i za cholerę nie wiem jak się do tego zabrać żeby hexa na bity rozebrać, wystarczyło by mi to na 2 cztero bitowe słowa to bym sobie case'ami sprawę załatwił, ale googlując i czytajac o konwersjach to masa jest c++ i innych ale samego c znaleźć za cholerę nie mogę, proszę o jakieś wskazówki.
    W kursie C jaki znalazłem było że C obsługuje hex, dec i okt ale bin za cholerę.
    Pozdrawiam.
  • REKLAMA
  • Pomocny post
    #2 6591346
    zdebel
    Poziom 15  
    Nie do końca rozumiem co dokładnie chcesz zrobić, ale np.

    int binareczka = 0b01010101;

    I tak sobie możesz ładnie zapisać. Jakbyś chciał liczbę bit po bicie, to może AND-uj maską, że np.
    if((liczba & 0b10000000)==1) to wiesz że najbardziej znaczacy bit jest ustawiony, potem maskujesz z 0b01000000 itd.

    Powiedz trochę dokładniej co chcesz zrobić to jakoś zaradzimy :)
  • REKLAMA
  • Pomocny post
    #3 6592673
    zumek
    Poziom 39  
    zdebel napisał:
    ...if((liczba & 0b10000000)==1) to wiesz że najbardziej znaczacy bit jest ustawiony...

    A cóż to za herezje, kolega nam tu wypisuje :?:

    hessuss
    Poczytaj o operacjach bitowych typu AND, OR, XOR(EOR), bo bez tego, daleko nie zajedziesz :-P
  • Pomocny post
    #4 6592849
    zdebel
    Poziom 15  
    TFU znaczy się sam if, bez porównania do 1, trzebaby to też zshiftować, przepraszam :D
  • REKLAMA
  • #5 6593532
    hessuss
    Poziom 13  
    OK.
    Działa :)
    Dzięki chłopaki.
    Wszystko przez to że w kursie C który czytałem pisało:" w ce mamy tylko zmienne szesnastkowe, dziesiętne i ósemkowe", a jak widać są binarne :D
    Co do zsziftowania to jak myślicie jaki algorytm jest szybszy:
    8 ifów po kolei:
    if (liczba & 0b00000001)
    if (liczba & 0b00000010)
    ...
    if (liczba & 0b10000000)

    czy jeden if w pętli "for" i za każdym razem przesuwanie bitu w masce?
    A może jest gdzieś w AVR Studio jakiś myk który pokazuje prędkość pracy algorytmu a ja o tym jeszcze nie wiem ?
  • REKLAMA
  • #6 6594217
    zdebel
    Poziom 15  
    wydaje mi się, że takie coś to lepiej 8 ifów (for-a zawsze można rozwinąć -funroll-loops czy jakoś tak :D). Z tym, że, sugeruje najpierw dać if, a następne wyrażenia to już else if, wtedy w momencie gdy któryś jest prawdziwy, następne nie będą sprawdzane :)
  • #7 6594366
    Freddie Chopin
    Specjalista - Mikrokontrolery
    zdebel napisał:
    wydaje mi się, że takie coś to lepiej 8 ifów

    Zgadza się - wydaje ci się.

    Co do if else if to też ci się wydaje, bo nie wiem jakim cudem takie coś mogłoby być użyte do transmisji do rejestru przesuwnego.

    4\/3!!
  • #8 6594505
    hessuss
    Poziom 13  
    Chyba znalazłem choć może mi się wydawać, proszę o opinie fachowca :)
    jak w AVR Studio odpalę debugowanie i run, to po lewej w okienku "Procesor" jest wartość CYCLE COUNTER. Czy ta wartość podaje ile cykli procesor machnął od początku do aktualnego momentu?
    Jeśli tak to 8 ifów jest szybsze 282 cycle kontra 414 cykli przy użyciu pętli for i przesuwaniu maski :D i żeby było weselej daje krótszy plik wynikowy po kompilacji :)
    Tylko niech mi ktoś powie czy dobrze myślę że te całe cycle counter to to?
  • #10 6595101
    zdebel
    Poziom 15  
    Coś kiespko ostatnio u mnie z myśleniem, else if faktycznie jest bez sensu, przepraszam :)
REKLAMA