| #include "os.h" |
| #include <mp.h> |
| #include "dat.h" |
| |
| /* res = b >> shift */ |
| void |
| mpright(mpint *b, int shift, mpint *res) |
| { |
| int d, l, r, i; |
| mpdigit this, last; |
| |
| res->sign = b->sign; |
| if(b->top==0){ |
| res->top = 0; |
| return; |
| } |
| |
| /* a negative right shift is a left shift */ |
| if(shift < 0){ |
| mpleft(b, -shift, res); |
| return; |
| } |
| |
| if(res != b) |
| mpbits(res, b->top*Dbits - shift); |
| d = shift/Dbits; |
| r = shift - d*Dbits; |
| l = Dbits - r; |
| |
| /* shift all the bits out == zero */ |
| if(d>=b->top){ |
| res->top = 0; |
| return; |
| } |
| |
| /* special case digit shifts */ |
| if(r == 0){ |
| for(i = 0; i < b->top-d; i++) |
| res->p[i] = b->p[i+d]; |
| } else { |
| last = b->p[d]; |
| for(i = 0; i < b->top-d-1; i++){ |
| this = b->p[i+d+1]; |
| res->p[i] = (this<<l) | (last>>r); |
| last = this; |
| } |
| res->p[i++] = last>>r; |
| } |
| while(i > 0 && res->p[i-1] == 0) |
| i--; |
| res->top = i; |
| if(i==0) |
| res->sign = 1; |
| } |