Das Zeichen '0' hat im
ASCII-Code den Wert 48, '1' den Wert 49 (wenn ich nicht irre, habe nicht nachgesehen). Durch Subtraktion kann also nur 0 oder 1 (als Zahl) dabei herauskommen. Was die Funktion tut, ist, einen String, der nur aus '0' und '1' besteht, binär wieder in eine Zahl zu wandeln. Schauen wir uns das mal mit der Beispielzahl 5 an (binär 101):
Der String lautet also '101', p ist initial 0.
Erster Durchlauf:
P := P*2 + (49 - 48)
Zahl ist nun 1 (=> 0*2 + 1)
Zweiter Durchlauf:
P := P*2 + (48 - 48)
Zahl ist nun 2 (=> 1*2 + 0)
Dritter Durchlauf:
P := P*2 + (49 - 48)
Zahl ist nun 5 (=> 2*2 + 1)
Da der String nur 3 Zeichen hatte, sind wir nun fertig. Weiteres zur binären Logik findest Du
hier.