matematykaszkolna.pl
c++ c++(matura): Dla podanej specyfikacji napisz algorytm, który oblicza wartość liczby zapisanej w kodzie U1. Mam daną specyfikację: Dane: d − długość zapisu U1 bin[1...d] = tablica, której elementami są pojedyncze bity zapisu U1, z czego bin[1] to bit znaku Wyniki: x − wartość liczby zapisanej w tablicy bin[1...d] Przykład: dla d=5 i bin [1...5]=[10110] wynikiem jest −9. x←0; i←2 jeżeli bin[1]=1 to dopóki i<=d jeżeli bin[i]=1 to bin[i] ←0 w przeciwnym wypadku bin[i] ←1 i←i+1 i←2; dopóki i<=d x←x*2+bin[i] i←i+1 jeżeli bin[1]=1 to x←x*(−1) Algorytm pochodzi od CKE − program napisany na jej podstawie oczywiście działa poprawnie (po zmianie co niektórych zmiennych w sposób, aby obsługiwały rzeczywiście tablice, czyli od indeksu [0], a nie [1]). Jednak nie rozumiem skąd wzięła się linijka zaznaczona przeze mnie na czerwono. Próbując wykonać ten algorytm w głowie, wciąż wychodzi mi 6. Mógłby mi to ktoś jakoś sensownie wytłumaczyć?
2 lip 09:51
c++(matura): ?
2 lip 10:21
Pytający: Dla bin=[10110] po pierwszej pętli (którą wykonujesz, bo bin[1]=1) masz bin=[11001], znaczy fragment bin[2..5] został zanegowany. Druga pętla do nic innego jak obliczenie wartości liczby binarnej bin[2..5]=[1001]. Otrzymujemy 10012=9. Wynik to −9, bo bin[1]=1. Zaznaczona linijka wynika z tego, że: [anan−1...a1a0]2=[anan−1...a10]2+a0=2*[anan−1...a1]2+a0 9=[1001]2=2*[100]2+1=2(2*[10]2+0)+1=2(2(2*[1]2+0)+0)+1=2(2(2(2*0+1)+0)+0)+1 // zaznaczone 0 to wartość x na początku pętli
2 lip 12:47