📄 sc_nbfriends.inc
字号:
ys = us; xs = vs; } const sc_digit *xend = (x + xnd); const sc_digit *yend = (y + ynd); // x is longer than y. small_type s = mul_signs(xs, ys); if (s > 0) { if (xs > 0) { // case 2 while (y < yend) (*d++) = (*x++) & (*y++); while (x++ < xend) (*d++) = 0; } else { // case 3 register sc_digit xcarry = 1; register sc_digit ycarry = 1; while (y < yend) { xcarry += (~(*x++) & DIGIT_MASK); ycarry += (~(*y++) & DIGIT_MASK); (*d++) = (xcarry & ycarry) & DIGIT_MASK; xcarry >>= BITS_PER_DIGIT; ycarry >>= BITS_PER_DIGIT; } while (x < xend) { xcarry += (~(*x++) & DIGIT_MASK); ycarry += DIGIT_MASK; (*d++) = (xcarry & ycarry) & DIGIT_MASK; xcarry >>= BITS_PER_DIGIT; ycarry >>= BITS_PER_DIGIT; } } } else { if (xs > 0) { // case 4 register sc_digit ycarry = 1; while (y < yend) { ycarry += (~(*y++) & DIGIT_MASK); (*d++) = ((*x++) & ycarry) & DIGIT_MASK; ycarry >>= BITS_PER_DIGIT; } while (x < xend) { ycarry += DIGIT_MASK; (*d++) = ((*x++) & ycarry) & DIGIT_MASK; ycarry >>= BITS_PER_DIGIT; } } else { // case 5 register sc_digit xcarry = 1; while (y < yend) { xcarry += (~(*x++) & DIGIT_MASK); (*d++) = (xcarry & (*y++)) & DIGIT_MASK; xcarry >>= BITS_PER_DIGIT; } while (x++ < xend) (*d++) = 0; } } s = convert_signed_2C_to_SM(nb, nd, dbegin); return CLASS_TYPE(s, nb, nd, dbegin); }// ----------------------------------------------------------------------------// SECTION: Friend functions for OR operators.// ----------------------------------------------------------------------------// Handles the cases 3-5 and returns the result.CLASS_TYPE OR_HELPER(small_type us, int unb, int und, const sc_digit *ud, small_type vs, int vnb, int vnd, const sc_digit *vd){ int nb = sc_max(unb, vnb); int nd = sc_max(und, vnd);#ifdef SC_MAX_NBITS sc_digit dbegin[MAX_NDIGITS];#else sc_digit *dbegin = new sc_digit[nd];#endif sc_digit *d = dbegin; register const sc_digit *x; register const sc_digit *y; int xnd; int ynd; small_type xs; small_type ys; if (und >= vnd) { x = ud; y = vd; xnd = und; ynd = vnd; xs = us; ys = vs; } else { y = ud; x = vd; ynd = und; xnd = vnd; ys = us; xs = vs; } const sc_digit *xend = (x + xnd); const sc_digit *yend = (y + ynd); // x is longer than y. small_type s = mul_signs(xs, ys); if (s > 0) { if (xs > 0) { // case 3 while (y < yend) (*d++) = (*x++) | (*y++); while (x < xend) (*d++) = (*x++); } else { // case 4 register sc_digit xcarry = 1; register sc_digit ycarry = 1; while (y < yend) { xcarry += (~(*x++) & DIGIT_MASK); ycarry += (~(*y++) & DIGIT_MASK); (*d++) = (xcarry | ycarry) & DIGIT_MASK; xcarry >>= BITS_PER_DIGIT; ycarry >>= BITS_PER_DIGIT; } while (x < xend) { xcarry += (~(*x++) & DIGIT_MASK); ycarry += DIGIT_MASK; (*d++) = (xcarry | ycarry) & DIGIT_MASK; xcarry >>= BITS_PER_DIGIT; ycarry >>= BITS_PER_DIGIT; } } } else { if (xs > 0) { // case 5 register sc_digit ycarry = 1; while (y < yend) { ycarry += (~(*y++) & DIGIT_MASK); (*d++) = ((*x++) | ycarry) & DIGIT_MASK; ycarry >>= BITS_PER_DIGIT; } while (x < xend) { ycarry += DIGIT_MASK; (*d++) = ((*x++) | ycarry) & DIGIT_MASK; ycarry >>= BITS_PER_DIGIT; } } else { // case 6 register sc_digit xcarry = 1; while (y < yend) { xcarry += (~(*x++) & DIGIT_MASK); (*d++) = (xcarry | (*y++)) & DIGIT_MASK; xcarry >>= BITS_PER_DIGIT; } while (x < xend) { xcarry += (~(*x++) & DIGIT_MASK); (*d++) = xcarry & DIGIT_MASK; xcarry >>= BITS_PER_DIGIT; } } } s = convert_signed_2C_to_SM(nb, nd, dbegin); return CLASS_TYPE(s, nb, nd, dbegin);}// ----------------------------------------------------------------------------// SECTION: Friend functions for XOR operators.// ----------------------------------------------------------------------------// Handles the cases 3-5 and returns the result.CLASS_TYPE XOR_HELPER(small_type us, int unb, int und, const sc_digit *ud, small_type vs, int vnb, int vnd, const sc_digit *vd){ int nb = sc_max(unb, vnb); int nd = sc_max(und, vnd);#ifdef SC_MAX_NBITS sc_digit dbegin[MAX_NDIGITS];#else sc_digit *dbegin = new sc_digit[nd];#endif sc_digit *d = dbegin; register const sc_digit *x; register const sc_digit *y; int xnd; int ynd; small_type xs; small_type ys; if (und >= vnd) { x = ud; y = vd; xnd = und; ynd = vnd; xs = us; ys = vs; } else { y = ud; x = vd; ynd = und; xnd = vnd; ys = us; xs = vs; } const sc_digit *xend = (x + xnd); const sc_digit *yend = (y + ynd); // x is longer than y. small_type s = mul_signs(xs, ys); if (s > 0) { if (xs > 0) { // case 3 while (y < yend) (*d++) = ((*x++) ^ (*y++)) & DIGIT_MASK; while (x < xend) (*d++) = (*x++); } else { // case 4 register sc_digit xcarry = 1; register sc_digit ycarry = 1; while (y < yend) { xcarry += (~(*x++) & DIGIT_MASK); ycarry += (~(*y++) & DIGIT_MASK); (*d++) = (xcarry ^ ycarry) & DIGIT_MASK; xcarry >>= BITS_PER_DIGIT; ycarry >>= BITS_PER_DIGIT; } while (x < xend) { xcarry += (~(*x++) & DIGIT_MASK); ycarry += DIGIT_MASK; (*d++) = (xcarry ^ ycarry) & DIGIT_MASK; xcarry >>= BITS_PER_DIGIT; ycarry >>= BITS_PER_DIGIT; } } } else { if (xs > 0) { // case 5 register sc_digit ycarry = 1; while (y < yend) { ycarry += (~(*y++) & DIGIT_MASK); (*d++) = ((*x++) ^ ycarry) & DIGIT_MASK; ycarry >>= BITS_PER_DIGIT; } while (x < xend) { ycarry += DIGIT_MASK; (*d++) = ((*x++) ^ ycarry) & DIGIT_MASK; ycarry >>= BITS_PER_DIGIT; } } else { // case 6 register sc_digit xcarry = 1; while (y < yend) { xcarry += (~(*x++) & DIGIT_MASK); (*d++) = (xcarry ^ (*y++)) & DIGIT_MASK; xcarry >>= BITS_PER_DIGIT; } while (x < xend) { xcarry += (~(*x++) & DIGIT_MASK); (*d++) = xcarry & DIGIT_MASK; xcarry >>= BITS_PER_DIGIT; } } } s = convert_signed_2C_to_SM(nb, nd, dbegin); return CLASS_TYPE(s, nb, nd, dbegin);}// End of file.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -