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 |
|
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. |
|
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. |
|
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ą. |
|
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ć? |
|
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. |
|
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 |
|
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(). Same wyeliminowanie powtórzeń z kodu skróci go kilkukrotnie. |
|
« 1 » |