działanie dodawania na stringach

0

Prosta funkcja zamieniająca liczbę-s w dowolnym b-systemie na int w systemie dziesiętnym (w zadaniu '-' przed liczbą oznacza jej ujemną wartość)
Opiera się na tym np:

121(4)=25(10)

oraz

1213(4)=25(10)⋅4(10)+3(10)=103(10).

(4) to liczba w systemie 4-kowym

Mam pytanie co do linijki wynik, rozumiem, że nie można po prostu dodać s[i], bo działania arytmetyczne nie działają na stringach, ale jak autor "przemycił" do wyniku dodawanie i-tej cyfry? Odjęcie znaku '0'? Może ktoś wytłumaczyć o co tam chodzi?

int zsystemu(string s, int b)
{ int wynik=0, i=0, znak=1;
if (s[0]=='-'){
znak=-1;
i=1;
}
int d=s.length();
for(;i<d;i++){
wynik=wynik*b+(s[i]-’0’);
}
return znak*wynik;
}
1

Odejmowanie offsetu. char tak jak int to typ całkowitoliczbowy. Ale char '0' nie jest równy int 0, ma inny zapis bitowy, gdyż nie jest kodowany jako 0x00. Trik polega na tym, że '0' - '0' to już jest int 0, '1- '0' to jest int 1, '2- '0' to jest int 2 i tak dalej, aż do 9.

0

Chyba rozumiem, ale tylko bardzo intuicyjnie. Czyli z odejmowania dwóch char'ów można uzyskać inta?

1

'0' to tak naprawdę liczba całkowita o kodzie 48. Wykonując operacje arytmetyczne na charach, wykonujesz operacje arytmetyczne na liczbach całkowitych im odpowiadającym. Okazuje się, że kolejnym cyfrom odpowiadają kolejne liczby całkowite - '0': 48, '1': 49, '2': 50 itd. Dlatego, jeśli od obecnego chara odejmiesz wartość 48, to dostaniesz cyfrę jako liczba, a nie jako znak.

0

Wszystko jasne, dzięki wam pięknie :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1