すみません、やはり多倍長の定義というのがよく分からなかったのですが
足し算はfanction_add(fb_int, fb_int);で定義されて
fnction_add(a,b);でa+bの多倍長型の値が返ってきます。
ビットシフトはfanction_sift(fb_int*, int);で定義されて
fanction_sift(a,b);でaをbビットシフトできます。
bの値が正なら右シフト、負なら左シフトです。

527さんのプログラムについてですが、if(r&1)というのがよくわかりません。
rと1のビット毎の論理積で、1が立っていればif内の処理をやるのだと思うのですが
内部でやってることが理解できてません。
例えばrが1101の場合、1=(0001)との論理積をとると、rの最下位ビットから
見ていく、という考えで合っているでしょうか?。
言葉足らず、稚拙な説明で申し訳ありません。