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 przepisanie bitów w zmiennych

Dawid 88 12 Gru 2014 12:58 1200 23
  • #1 12 Gru 2014 12:58
    Dawid 88
    Poziom 14  

    Witajcie. Mam tablice x elementową i muszę ją całą przesunąć o 2 bity w lewo (w kierunku tablicy o indeksie 0). Zacząłem od pętli for w której przesuwam zmienną o 2 bity w lewo no i teraz jest schodek dla mnie bo muszę przepisać z kolejnej tablicy 2 najstarsze bity do dwóch najmłodszych bitów wcześniejszej zmiennej i nie bardzo wiem jak.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 23
  • #2 12 Gru 2014 13:02
    rapid.prototypes
    Poziom 7  

    Użyj funkcji OR

    przykład 10001 OR 10101 =

    10001
    10101
    ------------
    10101 reasumując. Mozesz przesunąć najstarze bity o x pozycji w lewo a następnie wykonać OR w wyniku czego powinienes dostać to czego chcesz :)

    0
  • #3 12 Gru 2014 13:20
    Dawid 88
    Poziom 14  

    No nie bardzo bo mając np :
    a = 01011010
    b = 11001100
    przesuwam a o 2 bity w lewo
    a = 01101000
    i teraz funkcja or
    a = a or b
    a = 11101100 czyli nie dość że zniszczyłem sobie bity w a od 2 do 7 to jeszcze nie ustawiłem bitu 0 i bitu 1 tak jak bym chciał.

    Dodano po 8 [minuty]:

    Chodzi mi o taką operacje

    C przepisanie bitów w zmiennych

    przeniesienie tylko tych dwóch bitów reszta musi pozostać bez zmian

    0
  • #4 12 Gru 2014 13:37
    anonim206
    Poziom 13  

    Spróbuj może tak

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #5 12 Gru 2014 15:19
    Dawid 88
    Poziom 14  

    Niestety nie działa :(

    0
  • #6 12 Gru 2014 15:49
    rapid.prototypes
    Poziom 7  

    Dawid 88 napisał:
    No nie bardzo bo mając np :
    a = 01011010
    b = 11001100
    przesuwam a o 2 bity w lewo
    a = 01101000
    i teraz funkcja or
    a = a or b
    a = 11101100 czyli nie dość że zniszczyłem sobie bity w a od 2 do 7 to jeszcze nie ustawiłem bitu 0 i bitu 1 tak jak bym chciał.

    Dodano po 8 [minuty]:

    Chodzi mi o taką operacje

    C przepisanie bitów w zmiennych

    przeniesienie tylko tych dwóch bitów reszta musi pozostać bez zmian


    to zmienną b przesuń o 6 bitów w prawo. bedziesz miał wtedy 0000067 i walni wtedy A OR B :_)

    0
  • #7 12 Gru 2014 15:52
    Dawid 88
    Poziom 14  

    I jednocześnie utracę resztę bitów w b a ja ich potrzebuję przecież.

    0
  • #8 12 Gru 2014 16:42
    anonim206
    Poziom 13  

    a jakiego typu jest zmienna x? bo fragment kodu co Ci pokazałem musi działać kwestia poprawnego podania typu w sizeof

    0
  • #9 12 Gru 2014 17:08
    Dawid 88
    Poziom 14  

    Uint8_t x[500];

    0
  • #10 12 Gru 2014 17:14
    anonim206
    Poziom 13  

    czyli były dokonywane złe przesunięcia

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    (8*sizeof(int)-2)
    ten fragment liczył przesunięcie dla int wiec wychodziło 8*4-2=30 uint8 ma jeden bajt więc musimy przesunąć tylko o 6 bitów.

    0
  • #11 13 Gru 2014 09:56
    Chivo
    Poziom 21  

    Hej,

    Zaciekawił mnie ten problem i chciałbym pomóc (poćwiczyć C++). Jeśli dobrze rozumiem to chcesz bit 7 i 6 ze zmiennej B wpisać jako bit 1 i 2 do zmiennej A nie zmieniając reszty bitów?

    Pozdrawiam

    0
  • #12 13 Gru 2014 12:47
    rapid.prototypes
    Poziom 7  

    a= 11111110
    b=00000001
    int bb=b
    bb>>6
    a OR bb

    masz zmienną a i b gdzie a ma 6 i 7 starszy bit na najmłodszym miejscu

    0
  • #13 14 Gru 2014 22:46
    Dawid 88
    Poziom 14  

    Zdaje się że kolega rapid. dał rozwiązanie ale sprawdzę ją dopiero jutro wieczorem bo mam kolokwium :D Myślałem że da się to rozwiązać bez dodatkowych zmiennych no ale trudno. Wszyscy mówią że C daje dużo większe możliwości programiście niż bascom a w bascomie wystarczyło by
    zmiennaa.1 = zmiennab.7
    zmiennaa.0 = zmiennab.6
    i tyle.

    0
  • #14 15 Gru 2014 10:30
    anonim206
    Poziom 13  

    kolego nie potrzebujesz żadnych dodatkowych zmiennych.
    Jak masz elementy swojej tablicy powiedzmy(binarnie):
    x[0]=00000001
    x[1]=11000010
    x[2]=00000100
    to po zapisie:
    x[0] = x[0]<<2 + x[1]>>6;
    tutaj binarnie:
    x[0] =(00000001)<<2 + (11000010)>>6;
    czyli:
    x[0] = 00000100 + 00000011;
    czyli:
    x[0] = 00000111;
    więc po Ci dodatkowa zmienna?
    jak wszystko możesz obsłużyć w pętli:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Warunek został dodany tylko po to aby nie wyjść poza zakres tablicy bo w każdym przejściu pętli korzystamy z i i z i+1.

    1
  • #15 23 Mar 2015 21:18
    trol.six
    Poziom 30  

    To jest dość trudne jak dla kogoś kto dopiero się uczy.
    Pisze sobie kolega funkcje:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i wywołuje dla calej tablicy:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Problem pewnie dojdzie jak będzie kolega miał dane wielobajtowe big-endian ;)
    Tak, że, pisanie w C czasem jest bardzo trudne.

    Można to napisać inaczej, ale coś nie mam weny.

    -1
  • #16 24 Mar 2015 02:32
    -psiak-
    Poziom 32  

    @trol.six okropnie skomplikowałeś, wystarczy:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    -1
  • #17 24 Mar 2015 10:18
    trol.six
    Poziom 30  

    -psiak- napisał:
    @trol.six okropnie skomplikowałeś, wystarczy:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    To nie jest dobry przykład dla kogoś kto się uczy C.
    1. Deklaracje w pętli nie dotyczą każdego standardu języka C.
    2. Nie zauważyłem żeby kolega pisał o typie tablicy. Może ma tablice typu int?

    -1
  • #18 24 Mar 2015 10:30
    -psiak-
    Poziom 32  

    trol.six napisał:
    To nie jest dobry przykład dla kogoś kto się uczy C.
    Ja uważam inaczej a mam sporę doświadczenie dydaktyczne.

    trol.six napisał:
    1. Deklaracje w pętli nie dotyczą każdego standardu języka C.
    Standard z 99 roku (czyli poprzednie tysiąclecie) na to pozwala, z księżyca się urwałęś?

    trol.six napisał:
    2. Ostatni element nie ma nadostatniego ;) Co jeśłi tam jest inna dana?
    Masz problem ze zrozumieniem kodu, nie jest tu potrzebny nadostatni tylko przedpierwszy role którego spełnia zmienna v

    trol.six napisał:
    3. Nie zauważyłem żeby kolega pisał o typie tablicy. Może ma tablice typu int?
    Ja zauważyłem: w zadaniu przesunięcie o 2, w próbie rozwiązania przesunięcie o 2 oraz o 6 w drugą stronę, 2+6=8 czyli chodzi o bajty nie int'y. A nawet gdyby chodziło o int'y to zawsze można konwersje zrobić przy wywołaniu.

    trol.six napisał:
    4. Przesuwamy o 6 a nie o 8.
    Może powstrzymaj się od dawania rad w działach związanych z C/C++ widać wyraźnie że jednolinijkowego kodu nie jesteś w stanie przeczytać i zrozumieć.

    0
  • #19 24 Mar 2015 11:01
    trol.six
    Poziom 30  

    -psiak- napisał:
    trol.six napisał:

    trol.six napisał:
    1. Deklaracje w pętli nie dotyczą każdego standardu języka C.
    Standard z 99 roku (czyli poprzednie tysiąclecie) na to pozwala, z księżyca się urwałęś?

    Przecież napisałem że nie każde. Myśle że potrafisz czytać ze zrozumieniem.
    -psiak- napisał:

    trol.six napisał:
    4. Przesuwamy o 6 a nie o 8.
    Może powstrzymaj się od dawania rad w działach związanych z C/C++ widać wyraźnie że jednolinijkowego kodu nie jesteś w stanie przeczytać i zrozumieć.

    Moim zdaniem strasznie nieczytelne.
    Nie zauważyłem że kolega używa typu unsigned int. W takim przypadku, funkcja jest liczona poprawnie.

    0
  • #20 24 Mar 2015 11:21
    -psiak-
    Poziom 32  

    trol.six napisał:
    Przecież napisałem że nie każde. Myśle że potrafisz czytać ze zrozumieniem.
    Podany przez ciebie kod też nie w każdym standardzie się skompiluje (dla standardu sprzed ANSI - niepoprawna deklaracja funkcji), ale nie bierzmy pod uwagę rzeczy wymarłych.

    trol.six napisał:
    Moim zdaniem strasznie nieczytelne.
    Nie zauważyłem że kolega używa typu unsigned int. W takim przypadku, funkcja jest liczona poprawnie.
    Jeszcze jeden ekspert który jeszcze ne potrafi poprawnie przeczytać jednego wierszu kodu ale już wie co jest nieczytelne!

    Powiem ci co jest nieczytelne:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    ... oraz kompletny brak formatowania kodu.

    No i jako gwóźdź do trumny ...
    Czy naprawdę uważasz że kod napisany w 14 wierszach może być czytelniejszy od zapisanego w jednym wierszu?
    Jeżeli tak uważasz to na 100% nie brałeś udziału w większych projektach.

    Poza tym: - ilość błędów w kodzie jest zawsze proporcjonalna ilości wierszy,
    więc zawsze wybieraj jeden wiersz zamiast 14-tu.

    0
  • #21 24 Mar 2015 16:11
    trol.six
    Poziom 30  

    -psiak- napisał:
    trol.six napisał:
    Przecież napisałem że nie każde. Myśle że potrafisz czytać ze zrozumieniem.
    Podany przez ciebie kod też nie w każdym standardzie się skompiluje (dla standardu sprzed ANSI - niepoprawna deklaracja funkcji), ale nie bierzmy pod uwagę rzeczy wymarłych.

    Zawsze możesz się podzielić spostrzeżeniami na temat kodu. Od tego jest forum.

    -psiak- napisał:

    trol.six napisał:
    Moim zdaniem strasznie nieczytelne.
    Nie zauważyłem że kolega używa typu unsigned int. W takim przypadku, funkcja jest liczona poprawnie.
    Jeszcze jeden ekspert który jeszcze ne potrafi poprawnie przeczytać jednego wierszu kodu ale już wie co jest nieczytelne!

    Nie uważam się za eksperta. I w ogóle wycieczki osobiste mnie nie interesują.

    Zarzuca mi kolega nieumiejętność zrozumienia kodu, to wytłumaczyłem koledze skąd się one wzięły.
    Swój post poprawiałem jak kolega pisał swój. W tej przeglądarce naprawdę się zlało w jedno :)

    Może co najwyżej odesłać mnie kolega do okulisty. Ale bylem. Okulary nosze ;)


    -psiak- napisał:

    Powiem ci co jest nieczytelne:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    ... oraz kompletny brak formatowania kodu.

    Jeśli chodzi o wcięcia to są w moim oryginalnym poście. Przynajmniej moja przeglądarka to ma:
    Nie stosuje wcięć po funkcji. To fakt.
    Oto zrzut:
    C przepisanie bitów w zmiennych

    "din" od "datainput" ;)

    Oczywiście, można ten kod zmodyfikować i to w bardziej znaczący sposób.


    -psiak- napisał:

    No i jako gwóźdź do trumny ...
    Czy naprawdę uważasz że kod napisany w 14 wierszach może być czytelniejszy od zapisanego w jednym wierszu?
    Jeżeli tak uważasz to na 100% nie brałeś udziału w większych projektach.

    Poza tym: - ilość błędów w kodzie jest zawsze proporcjonalna ilości wierszy,
    więc zawsze wybieraj jeden wiersz zamiast 14-tu.

    Też kiedyś pisałem długie jednolinijkowce. Bo to zawsze szkoda klepnąć ENTER po opcjach pętli. Jednak przestałem.

    Tak, szybciej i lepiej mi się przegląda taki kod, z mniejszą ilością zmiennych w linijce. Za to posiadający więcej linijek. Stosuje często puste linie. Tak sporo kodu widziałem, pisanych przez różnych ludzi.

    Każdy kod ma określone cechy. Sam zastosowałem void* aby potem tego nie robić rzutowania podczas wywołania funkcji. A przecież, w prostym programie nie potrzeba nawet tworzyć funkcji.

    0
  • #22 24 Mar 2015 17:45
    BeginEnd
    Poziom 14  

    kolega dawid88 uczy się programowania od zera, z jakiegoś języka wysokopoziomowego się przesiada czy z HDLA/veriloga?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Da się to napisać bardziej optymalnie ale na pierwszy raz to wystarczy.
    Od razu mówię, że nie kompilowałem tego ale chodzi o coś takiego mniej więcej.

    Nie słuchaj ludzi którzy nie robią wcięć w kodzie albo piszą w stylu:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Oni nie są twoimi przyjaciółmi :)

    Pozdrawiam

    0
  • #23 24 Mar 2015 19:31
    -psiak-
    Poziom 32  

    @BeginEnd, takie banały:

    BeginEnd napisał:
    Nie słuchaj ludzi którzy nie robią wcięć w kodzie albo piszą w stylu:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    nie ma sensu pisać.
    Przecież @Dawid 88 z całą pewnością szybko się zorientuje że jego prawdziwymi przyjaciółmi są ci którzy:
    • piszą perły typu:
    BeginEnd napisał:
    Dobry zwyczaj deklarowania zmiennych na początku funkcji.
    kiedy to nowszy standard C (od C99) pozwala deklarować zmienne tam gdzie są potrzebne, oraz wszystkie współczesne języki C podobne C++/C#/Java - również pozwalają deklarować zmienne tam gdzie są potrzebne, ba nie tylko pozwalają zaś twórcy języków radzą właśnie tak deklarować zmienne. Z tego wynika że "przyjaciele" uważają twórców współczesnych języków i standardów za ... no właśnie nie wiem nawet
    • każą mu
    BeginEnd napisał:
    ... sobie przetłumaczyć ...
    14 lub 10 wierszy zamiast jednego.
    • w kodzie sprawdzają rozmiar zmiennej typu uint8_t (pewnie nie wiedząc co oznacza ta 8-ka w nazwie)
    • nie rozumieją różnicy pomiędzy ++i a i++
    • wpisują wykonanie kodu (8 * sizeof(array[0]) - 2) na każdym kroku pętli
    • nie wiedzą o istnieniu operatora <<=

    I z całą pewnością właśnie takich przyjaciół będzie słuchać.

    0
  • #24 24 Mar 2015 20:10
    adamas_nt
    Moderator Programowanie

    Proszę trochę ostudzić temperamenty. Dyskusja ciekawa, ale... bez "prztyczków w nos" też można konwersować :)

    Po mojemu wszyscy macie rację. Jeśli ktoś ma coś analizować, piszę tak, aby zrozumiał i... żeby mi łatwiej było tłumaczyć ;)

    0