1 #include "os.h" 2 #include <mp.h> 3 #include "dat.h" 4 5 // res = b << shift 6 void 7 mpleft(mpint *b, int shift, mpint *res) 8 { 9 int d, l, r, i, otop; 10 mpdigit this, last; 11 12 // a negative left shift is a right shift 13 if(shift < 0){ 14 mpright(b, -shift, res); 15 return; 16 } 17 18 // b and res may be the same so remember the old top 19 otop = b->top; 20 21 // shift 22 mpbits(res, otop*Dbits + shift); // overkill 23 res->top = DIGITS(otop*Dbits + shift); 24 d = shift/Dbits; 25 l = shift - d*Dbits; 26 r = Dbits - l; 27 28 if(l == 0){ 29 for(i = otop-1; i >= 0; i--) 30 res->p[i+d] = b->p[i]; 31 } else { 32 last = 0; 33 for(i = otop-1; i >= 0; i--) { 34 this = b->p[i]; 35 res->p[i+d+1] = (last<<l) | (this>>r); 36 last = this; 37 } 38 res->p[d] = last<<l; 39 } 40 for(i = 0; i < d; i++) 41 res->p[i] = 0; 42 43 // normalize 44 while(res->top > 0 && res->p[res->top-1] == 0) 45 res->top--; 46 } 47