Hej Wykonałem algorytm o który prosiłeś - a przynajmniej tak mi się wydaję. Rozumiem, że piszesz jakąś klasę typu VLI [Very Large Integer]?
Aby wykonać to zadanie spróbowałem odwrócić algorytm, którym można zamienić dowolną liczbę dziesiętną na binarną, tj. wykorzystujący modulo i odwracanie wyników. Aby zamienić 11 na system binarny wykonujemy następujące kroki:
11 mod 2 = 1
5 mod 2 = 1
2 mod 2 = 0
1 mod 2 = 1
Przepisujemy od dołu i uzyskujemy 11_dec = 1011_bin
Aby odwrocić to działanie początkowo posłużyłem się czymś takim. Mam dwie tablice, bin[] zawierającą cyfry binarne i dec[], w której zapiszę cyfry dziesiętne. Poczyniłem założenie dla uproszczenia, że ich rozmiary są jednakowe. Zauwazmy, że pozycja binarna k, może modyfikować maksymalnie pozycję (zaokrągl.w.dół(log_10 z 2^k)), co korzystajac z wzorów na logarytmy mogę zapisać jako zaokrągl.w.dół(k * log_10 z (2)). Lista kroków:
1. Przemnóż wszystkie pola tablicy dec[] od (n-1) do (n-k) przez 2.
2. Jeśli cyfra binarna to 1, dodaj 1 do ostatniej pozycji w tablicy [najmniej znaczący bit liczby]
3. Sprawdz czy któreś pole jest większe bądź równe 10, jeśli tak, to pole %= 10, a poprzedzająca ją cyfra zostaje zwiększona o 1. [tez dla zakresu dec[n-1] do dec[n-k].
Zauważmy, że co obrót pętli wystarczy dodawać do k wartość logarytmu zapisaną jako stałą, bo wynika to z wzorów dla logarytmów.
A teraz kod - może on objaśni więcej:
#include <iostream>
#include <cstdint> //wybralem int8_t, bo wystarczy, aby przechowac cyfre od 0 do 9
constexpr long double LOG_10_OF_2 = 0.301029996;
int8_t* convertBinToDec(int8_t bin[], int8_t dec[], size_t n) {
long double k = 0; //ogranicznik iteracji, bo chcemy oszczedzac pozycje
for (size_t i = 0; i < n; ++i) { //dla tablicy liczb binarnych
for (size_t j = 0; j <= k; ++j) { //dla indexow od n-1 do n-(floor(k))
dec[n-j-1] *= 2; //przemnoz wynik * 2
}
if (bin[i]) { //jesli binarna cyfra to 1, to zwieksz ostatnia cyfre o 1
dec[n-1]++;
}
for (size_t j = 0; j <= k; ++j) {
if (dec[n-j-1] >= 10) { //sprawdz, czy ktoras cyfra nie wychodzi poza zakres
dec[n-j-1] %= 10; //obsluz ten przypadek
dec[n-j-2]++; //zwieksz poprzedzajaca cyfre o 1
}
}
k += LOG_10_OF_2; //korzystajac z prawa logarytmow zwiekszam max zassieg na jaki wplywa cyfra binarna
}
return dec; //wg konwencji zwracam tablice ktora modyfikuje
}
int main() {
constexpr size_t BITS = 4;
int8_t src[BITS] = {1, 0, 1, 1};
int8_t dest[BITS] = {}; //inicjalizacja zerami przy pomocy domyslnego konstruktora typu numerycznego
for (auto& b : src) {
std::cout << (int)b;
}
std::cout << "_bin = ";
convertBinToDec(src, dest, BITS);
for (auto& d : dest) {
std::cout << (int)d;
}
std::cout << "_dec" << std::endl;
return 0;
}
W razie pytań pisz - być może trochę zagmatwałem tłumaczenie. Ale jeśli coś jest niejasne, to postaram się to bardziej uprościć. Pozdrawiam i powodzenia!