| #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--; |
| } |