BigNum BigNum::operator /(const BigNum& operand) const { std::vector<uint8_t> quotient, current; bool started = false; for (ssize_t i = data.size() - 1; i >= 0; i--) { current.push_back(data[i]); BigNum bcurrent(current); uint8_t q = bcurrent.smallDivide(operand); current = (bcurrent - ((operand) * BigNum(q))).toVector(); if (started or q != 0) { started = true; quotient.push_back(q); } } return BigNum(quotient, negative xor operand.negative); }
void eval_shield(pawn_entry_t *p, int *scoremg) { int current, min, penalty; uint8 castle; if(pos->pcount[BQ]) { min = INF; current = wcurrent(p, pos->ksq[W]); castle = pos->castle & ~(BLACK_OO|BLACK_OOO); if(castle & WHITE_OO) min = p->wg1; if((castle & WHITE_OOO) && (min > p->wb1)) min = p->wb1; if(castle && (min < current)) penalty = (min + current) / 2; else penalty = current; *(scoremg) -= penalty; } if(pos->pcount[WQ]) { min = INF; current = bcurrent(p, pos->ksq[B]); castle = pos->castle & ~(WHITE_OO|WHITE_OOO); if(castle & BLACK_OO) min = p->bg8; if((castle & BLACK_OOO) && (min > p->bb8)) min = p->bb8; if(castle && (min < current)) penalty = (min + current) / 2; else penalty = current; *(scoremg) += penalty; } }