 |
Coders' city Nasza pasja to programowanie!
|
| Zobacz poprzedni temat :: Zobacz następny temat |
| Autor |
Wiadomość |
Dijskra
Dołączył: 13 Lut 2012 Posty: 2
|
Wysłany: Pon Lut 13, 2012 8:57 pm Temat postu: [C] Zwracana wartość |
|
|
Witam, chciałem tylko aby ktoś starszy i mądrzejszy sprawdził moje rozumowanie:
| Kod: |  char CheckDelay (unsigned int t)
 {
 return(((t - a & 0x8000) >> 8);
 }
|
Jest to kawałek kodu większego programu, który w obecnej chwili rozpracowuje. Problem zapewne dla wielu trywialny, mimo to chcę się upewnić. Mamy wartość wejściową int t (załóżmy że wyrażenie : t - a = 1003), zamieńmy tą liczbę na szesnastkową: 1003 = 3EB Teraz 3EB dwójkowo : 0011 1110 1011 0x8000 dwójkowo : 1000 0000 0000 0000
koniunkcja & :
0000 0000 0000
i przesunie o 8 miejsc w prawo (>> 8) daje to samo.
Czy to jest poprawne obliczenie ? I jeszcze tak jedna sprawa - jak rozumiem wyrażenia bitowe są uznawane za true, jeśli przynajmniej jeden bit z ciągu ma wartość równą 1. Pytam, bo później zwrot z tej funkcji (CheckDelay) jest w warunku if , wiec wydaje się bezsensu przesuwanie o te 8 bitów. Ale być może się mylę.
Kompilator : avr - gcc
Pozdrawiam.
|
|
| Powrót do góry |
|
 |
|
|
mikmas

Dołączył: 26 Maj 2005 Posty: 5617 Skąd: From Alex Stadt
|
Wysłany: Wto Lut 14, 2012 7:16 am Temat postu: |
|
|
Tak, dobrze rozumiesz. Jednak jeżeli chodzi o przesunięcie, to chodzi o to, aby się zmieściło w char, które jest 1B.
| Cytat: | | jak rozumiem wyrażenia bitowe są uznawane za true, jeśli przynajmniej jeden bit z ciągu ma wartość równą 1 |
W skrócie: jeżeli wartość nie jest zerowa to if "przechodzi dalej" (tudzież inne warunkowe)
_________________ -----BEGIN GEEK CODE BLOCK----- Version: 3.1 GCS d- s---:--->+:+ a-->--- C++(+++) U-- P+ L-- E-- W++ N+ o-- K- w++(+++) O--- M-(--) V-- PS PE++ Y PGP- t 5 X++ R tv- b+ DI- D+++(++++) G++ e h* r+ y? ------END GEEK CODE BLOCK------ Alternatywny komunikator GG |
|
| Powrót do góry |
|
 |
marcin_an Site Admin
Dołączył: 26 Maj 2005 Posty: 17278 Skąd: z drugiej strony Kabla
|
Wysłany: Wto Lut 14, 2012 8:46 am Temat postu: |
|
|
Dijkstra: Dobrze, że to nie aplikacja desktopowa, bo zaliczałoby się do typowych przykładów przedwczesnej optymalizacji i jej nieoczekiwanych, ale spodziewanych skutków. W uC jeszcze przejdzie.
Wyrażenie to - przy założeniu wyniku prawda/fałsz - jest funkcją, która daje prawdę dla każdego t i a, których różnica ma na szesnastym bicie 1, czyli jest w zakresie: [n · 65536 + 32768 ; (n+1) · 65536), dla n=0, 1,... (przy założeniu, że t jest niemniejsze od a) W załączniku obrazek, który prezentuje tę funkcję. Zielone obszary to te, gdzie mamy prawdę.
Widać jak na dłoni, że coś tu nie gra, bo funkcja jest okresowa. Nie to, żeby w programowaniu takowe się nie pojawiały, ale poza kilkoma sytuacjami (i ta do nich nie należy) wyrazenia dające takie obrazy są rzadkie. Należy zatem przyjąć, że albo autor był nieprzytomny i zrobił błąd, albo jest jeszcze jakieś niejawne założenie. Obstawiam, że tym założeniem jest, że przynajmniej t jest zmienną 16-bitową. To ogranicza nam mocno zakres funkcji (do tego żółtego obszaru). Tym samym funkcja da prawdę tylko w tym małym, jasnozielonym trójkącie. A co ten trójkąt oznacza? Ano to, że różnica musi być większa od 32768. Czyli: | Kod: |  int CheckDelay(unsigned int t) {
 return t - a > 32768;
 }
|
I teraz powinno być jasne, co ten zapis ma oznaczać...
| Opis: |
|
 Pobierz |
| Nazwa pliku: |
cc-avfd-9363ed3e533e9877bad51691e06ba0b6.png |
| Wielkość pliku: |
17.49 KB |
| Pobierano: |
35 raz(y) |
_________________ Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok. "Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza |
|
| Powrót do góry |
|
 |
mikmas

Dołączył: 26 Maj 2005 Posty: 5617 Skąd: From Alex Stadt
|
Wysłany: Wto Lut 14, 2012 9:14 am Temat postu: |
|
|
Ciekawe wytłumaczenie. Też skorzystam :P
_________________ -----BEGIN GEEK CODE BLOCK----- Version: 3.1 GCS d- s---:--->+:+ a-->--- C++(+++) U-- P+ L-- E-- W++ N+ o-- K- w++(+++) O--- M-(--) V-- PS PE++ Y PGP- t 5 X++ R tv- b+ DI- D+++(++++) G++ e h* r+ y? ------END GEEK CODE BLOCK------ Alternatywny komunikator GG |
|
| Powrót do góry |
|
 |
marcin_an Site Admin
Dołączył: 26 Maj 2005 Posty: 17278 Skąd: z drugiej strony Kabla
|
Wysłany: Wto Lut 14, 2012 9:21 am Temat postu: |
|
|
To sprawdź przy okazji, czy się nie pomyliłem w obliczeniach, bo jestem po nieprzespanej nocy ;).
_________________ Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok. "Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza |
|
| Powrót do góry |
|
 |
Dijskra
Dołączył: 13 Lut 2012 Posty: 2
|
Wysłany: Wto Lut 14, 2012 8:01 pm Temat postu: |
|
|
Witam ponownie !
Dziękuję za odpowiedzi.
| Cytat: | Wyrażenie to - przy założeniu wyniku prawda/fałsz - jest funkcją, która daje prawdę dla każdego t i a, których różnica ma na szesnastym bicie 1, czyli jest w zakresie: [n · 65536 + 32768 ; (n+1) · 65536), dla n=0, 1,... (przy założeniu, że t jest niemniejsze od a) |
To jest dla mnie zrozumiałe i logiczne, tylko jedna poprawka typ int jest 16 bitowy tak więc maksymalna wartość to 0xFFFF = 65535. Co do samej funkcji :
| Kod: |  char CheckDelay (unsigned int t)
 {
 return(((t - a) & 0x8000) >> 8);
 }
|
zmienna a również jest typu unsigned int, i jest inkrementowana o 1 co 1 ms działana programu. Tak więc wartość t -a (przy t = 1004) zostanie przepełnione po 1005 milisekundach dzialania programu i wówczas osiągnie wartość 65535, równoznaczne z true dla warunku. Warunek będzie spełniony przez kolejne 65535 - 32768 = 32767ms działania programu. Funkcja przypisująca wartość t wygląda tak :
| Kod: |  unsigned int SetDelay(unsigned int t)
 {
 return(a + t - 1);
 }
|
Tak więc jak mi się wydaje ma to za zadanie po prostu wykonanie pewnej instrukcji programu w ściśle określonych odstępach czasu.
| Cytat: | | Tak, dobrze rozumiesz. Jednak jeżeli chodzi o przesunięcie, to chodzi o to, aby się zmieściło w char, które jest 1B |
No tak zapomniałem że char jest 8 bitowy, bez tego przesunięcia obcięło by mi idealnie tą 1 z 16 bitu.
Teraz chyba już wszystko jest to dla mnie zrozumiałe. Jeszcze raz dziękuje za pomoc i pozdrawiam.
|
|
| Powrót do góry |
|
 |
|
|
Możesz pisać nowe tematy Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Możesz dodawać załączniki na tym forum Możesz pobierać pliki z tego forum
|
 Debug: strone wygenerowano w 0.20137 sekund, zapytan = 11
|