#include "os.h" | |
#include <mp.h> | |
#include "dat.h" | |
/* res = b << shift */ | |
void | |
mpleft(mpint *b, int shift, mpint *res) | |
{ | |
int d, l, r, i, otop; | |
mpdigit this, last; | |
res->sign = b->sign; | |
if(b->top==0){ | |
res->top = 0; | |
return; | |
} | |
/* a negative left shift is a right shift */ | |
if(shift < 0){ | |
mpright(b, -shift, res); | |
return; | |
} | |
/* b and res may be the same so remember the old top */ | |
otop = b->top; | |
/* shift */ | |
mpbits(res, otop*Dbits + shift); /* overkill */ | |
res->top = DIGITS(otop*Dbits + shift); | |
d = shift/Dbits; | |
l = shift - d*Dbits; | |
r = Dbits - l; | |
if(l == 0){ | |
for(i = otop-1; i >= 0; i--) | |
res->p[i+d] = b->p[i]; | |
} else { | |
last = 0; | |
for(i = otop-1; i >= 0; i--) { | |
this = b->p[i]; | |
res->p[i+d+1] = (last<<l) | (this>>r); | |
last = this; | |
} | |
res->p[d] = last<<l; | |
} | |
for(i = 0; i < d; i++) | |
res->p[i] = 0; | |
/* normalize */ | |
while(res->top > 0 && res->p[res->top-1] == 0) | |
res->top--; | |
} |