void hd_sparse(DSS_HUGE i, DSS_HUGE *ok, long seq) { long low_mask, seq_mask; static int init = 0; static DSS_HUGE *base, *res; if (init == 0) { INIT_HUGE(base); INIT_HUGE(res); init = 1; } low_mask = (1 << SPARSE_KEEP) - 1; seq_mask = (1 << SPARSE_BITS) - 1; bin_bcd2(i, base, base + 1); HUGE_SET (base, res); HUGE_DIV (res, 1 << SPARSE_KEEP); HUGE_MUL (res, 1 << SPARSE_BITS); HUGE_ADD (res, seq, res); HUGE_MUL (res, 1 << SPARSE_KEEP); HUGE_ADD (res, *base & low_mask, res); bcd2_bin (&low_mask, *res); bcd2_bin (&seq_mask, *(res + 1)); *ok = low_mask; *(ok + 1) = seq_mask; return; }
main() { long bin, low_bcd, high_bcd; int i; bin = MAXINT; printf("%ld\n", bin); bin_bcd2(bin, &low_bcd, &high_bcd); printf("%ld %ld\n", high_bcd, low_bcd); bin = 0; bcd2_bin(&bin, high_bcd); bcd2_bin(&bin, low_bcd); printf( "%ld\n", bin); for (i=9; i >= 0; i--) printf("%dth digit in %d is %d\n", i, bin, GET_DIGIT(i, low_bcd, high_bcd)); bcd2_add(&low_bcd, &high_bcd, MAXINT); bin = 0; bcd2_bin(&bin, high_bcd); high_bcd = bin; bin = 0; bcd2_bin(&bin, low_bcd); low_bcd = bin; printf( "%ld%07ld\n", high_bcd, low_bcd); bin_bcd2(14, &low_bcd, &high_bcd); bcd2_mul(&low_bcd, &high_bcd, 23L); bin = 0; bcd2_bin(&bin, high_bcd); bcd2_bin(&bin, low_bcd); printf( "%ld\n", bin); bcd2_div(&low_bcd, &high_bcd, 10L); bin = 0; bcd2_bin(&bin, high_bcd); bcd2_bin(&bin, low_bcd); printf( "%ld\n", bin); }
int bcd2_add(long *bcd_low, long *bcd_high, long addend) { long tmp_lo, tmp_hi, carry, res; int digit; bin_bcd2(addend, &tmp_lo, &tmp_hi); carry = 0; for (digit=0; digit < 14; digit++) { res = GET_DIGIT(digit, *bcd_low, *bcd_high); res += GET_DIGIT(digit, tmp_lo, tmp_hi); res += carry; carry = res / 10; res %= 10; SET_DIGIT(res, digit, bcd_low, bcd_high); } return(carry); }
int bcd2_sub(long *bcd_low, long *bcd_high, long subend) { long tmp_lo, tmp_hi, carry, res; int digit; bin_bcd2(subend, &tmp_lo, &tmp_hi); carry = 0; for (digit=0; digit < 14; digit++) { res = GET_DIGIT(digit, *bcd_low, *bcd_high); res -= GET_DIGIT(digit, tmp_lo, tmp_hi); res -= carry; if (res < 0) { res += 10; carry = 1; } SET_DIGIT(res, digit, bcd_low, bcd_high); } return(carry); }
int bcd2_mul(long *bcd_low, long *bcd_high, long multiplier) { long tmp_lo, tmp_hi, carry, m_lo, m_hi, m1, m2; int udigit, ldigit, res; tmp_lo = *bcd_low; tmp_hi = *bcd_high; bin_bcd2(multiplier, &m_lo, &m_hi); *bcd_low = 0; *bcd_high = 0; carry = 0; for (ldigit=0; ldigit < 14; ldigit++) { m1 = GET_DIGIT(ldigit, m_lo, m_hi); carry = 0; for (udigit=0; udigit < 14; udigit++) { m2 = GET_DIGIT(udigit, tmp_lo, tmp_hi); res = m1 * m2; res += carry; if (udigit + ldigit < 14) { carry = GET_DIGIT(udigit + ldigit, *bcd_low, *bcd_high); res += carry; } carry = res / 10; res %= 10; if (udigit + ldigit < 14) { SET_DIGIT(res, udigit + ldigit, bcd_low, bcd_high); } } } return(carry); }