ref: 5ca4afb2491571cc96ba1c1a6a0bee0b1912bab5
dir: /sys/src/libmp/port/mpleft.c/
#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--; }