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

Przeuswanie bitów w C

Ostatnio zmodyfikowano 2020-06-08 18:54
Autor Wiadomość
cararith
Temat założony przez niniejszego użytkownika
Przeuswanie bitów w C
» 2020-05-26 17:36:08
Dzień dobry, muszę napisać program (język C), który będzie przesuwać bity, niżej przedstawie stany programu jakie ma wyświetlać po kolei.
Nie mam pojęcia jak to zrobić, ktoś pomoże?
Jedyne co mi się udało napisać to że, program dochodzi do stanu 10000000 i się kończy, ale zapewne trzeba podejść do tego inaczej. Od razu zaznaczę, że chcę zrobić to jak naprościej. Nie mam do czynienia z programowaniem na codzień, tym bardziej z językiem C.

stany:

00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
10000001
10000010
...
...
11111111
P-176933
DejaVu
» 2020-05-26 19:04:34
Napisz drugą pętlę, która zrobi drugą iterację. Potem napisz trzecią pętlę, która zrobi trzecią iterację. Potem napisz czwartą... i tak do końca. Wówczas być może zauważysz, że to da się uprościć i skrócić mocno kod do kilku linijek.
P-176934
cararith
Temat założony przez niniejszego użytkownika
odp
» 2020-05-29 04:15:25
unsigned char Queue(unsigned char input){
        if(input<=128)
                return input<<1;

}
void IntToBinary(unsigned char input){
        short i=7;

        while (i>=0) {
                printf("%d",(input >> i) & 1);
                i--;
        }
}
void Delay(){
        int c,d;
        for (c = 1; c <= 32767; c++) {
                for (d = 1; d <= 32767; d++) {
                        {}
                }
        }
}
int main(void){

unsigned char display=0;
unsigned char display2=0;
unsigned char queue=1;
unsigned char queue2=1;
int a=0;
int b=0;
while (a<8) {
                                display=queue;
                                queue=Queue(queue);
                                printf("\r");
                                IntToBinary(display);
                                Delay();
                                if(a!=8)
                                        a++;

                                while (a==8&&b<7) {

                                        display2=queue2;
                                        queue2=Queue(queue2);
                                        printf("\r");
                                        IntToBinary(display2);
                                        Delay();
                                        b++;

                                }
                        }
}

napisałem coś takiego, potrafiłbym dokończyc kolejne pętle, jednak po printf("\r") w 2 pętli, z 1 pętli nie widać 10000000. Co zrobić aby ta 1 na początku została a zmieniały się tylko kolejne 7 bitów. Jakiś warunek==128 i wyświetlenie binarnie wartości 128 mógłby tą 1 zostawić, ale ten printf("\r") tak czy siak ją usunie.
P-176936
pekfos
» 2020-05-29 17:11:53
Po co wypisujesz wynik w dwóch różnych miejscach? Po zmianie \r na \n widać, że nie generujesz nawet docelowego wzorca.
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
00000001
00000010
00000100
00001000
00010000
00100000
01000000
Najpierw niech wynik będzie poprawny, sposób wyświetlania jest rzeczą drugorzędną.
P-176937
cararith
Temat założony przez niniejszego użytkownika
» 2020-05-30 02:30:42
                        while (a<8) {
                                display=queue;
                                if(display<=128)
                                        queue=queue<<1;
                                else if(display==128)
                                        queue=queue;

                                printf("\n");
                                IntToBinary(display);
                                Delay();
                                if(a!=8)
                                        a++;


                        } while (b<7) {
                                display2=queue2;
                                if(display2<=64)
                                        queue2=queue2<<1;
                                else if(display2==64)
                                        queue2=queue2;

                                printf("\n");

                                IntToBinary(display2);
                                Delay();
                                if(b!=7)
                                        b++;


                        }

Zmieniłem trochę i zauważyłem, ze funkcja IntToBinary nie będzie nigdy wstanie wyświetlić np. 2 jedynek na tych 8 bitach. Jak mógłbym to zmienić?
P-176938
jankowalski25
» 2020-05-30 08:32:19
funkcja IntToBinary nie będzie nigdy wstanie wyświetlić np. 2 jedynek na tych 8 bitach
Ale przecież ta funkcja nie musi tego robić. Jeśli masz na przykład
10000000
 oraz
00000001
, to możesz przecież te dwie liczby połączyć operatorem
pierwszy | drugi
, czyli po prostu wykonać bitowo
or
 na tych liczbach i otrzymasz
10000001
. Albo możesz też te liczby po prostu dodać, w tym przypadku wynik będzie taki sam.
P-176939
cararith
Temat założony przez niniejszego użytkownika
czy da rade to jakoś uprościć?
» 2020-06-08 06:58:11
temat zamknięty
P-177011
pekfos
» 2020-06-08 18:54:51
Jesteś pewien że potrzebujesz tyle zmiennych i pętli? Można to zrobić na paru zmiennych i dwóch pętlach, w tym tą z IntToBinary().

jak to zrobić?
Same wyeliminowanie powtórzeń z kodu skróci go kilkukrotnie.
P-177015
« 1 »
  Strona 1 z 1