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