/* Analagous to mp2dfr, but for whole-number radix 256 numbers rather than fractions. Kenneth B. Russell (kbrussel@media.mit.edu) 8/98 */ void mp2d(unsigned char a[], unsigned char s[], int n, int *m) { int j, k, c; unsigned char v; unsigned char t, carry; unsigned char msb; msb = ~0; msb = ~(msb >> 1); /* Round up digit estimate to avoid truncated output */ *m = (int) (2.408 * n + 1); for (j=1;j<=(*m)+1;j++) s[j]=0; for (j=1;j<=n;j++) { v = a[j]; for (k=0;k<8;k++) { /* Multiply s by 2 */ carry=0; for (c=*m;c>=1;c--) { t=2*s[c]+carry; carry = t/10; s[c]=t%10; } if (v & msb) { /* Must add 1 to s */ carry = 1; for (c=*m;c>=1;c--) { t = s[c]+carry; carry = t/10; s[c]=t%10; } } v<<=1; } } for(j=1;j<=*m;j++) s[j]+='0'; /* Trim leading zeros */ j=1; while (s[j] == '0') j++; if (j>1) { for(k=j;k<=(*m)+1;k++) s[k-j+1]=s[k]; *m=*m-j+1; } }