plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

mpleft.c (924B)


      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 	res->sign = b->sign;
     13 	if(b->top==0){
     14 		res->top = 0;
     15 		return;
     16 	}
     17 
     18 	/* a negative left shift is a right shift */
     19 	if(shift < 0){
     20 		mpright(b, -shift, res);
     21 		return;
     22 	}
     23 
     24 	/* b and res may be the same so remember the old top */
     25 	otop = b->top;
     26 
     27 	/* shift */
     28 	mpbits(res, otop*Dbits + shift);	/* overkill */
     29 	res->top = DIGITS(otop*Dbits + shift);
     30 	d = shift/Dbits;
     31 	l = shift - d*Dbits;
     32 	r = Dbits - l;
     33 
     34 	if(l == 0){
     35 		for(i = otop-1; i >= 0; i--)
     36 			res->p[i+d] = b->p[i];
     37 	} else {
     38 		last = 0;
     39 		for(i = otop-1; i >= 0; i--) {
     40 			this = b->p[i];
     41 			res->p[i+d+1] = (last<<l) | (this>>r);
     42 			last = this;
     43 		}
     44 		res->p[d] = last<<l;
     45 	}
     46 	for(i = 0; i < d; i++)
     47 		res->p[i] = 0;
     48 
     49 	/* normalize */
     50 	while(res->top > 0 && res->p[res->top-1] == 0)
     51 		res->top--;
     52 }