divide = (a, b) => {
let isNegative = false;
let dividend = a;
let divisor = b;
if (AND(dividend, LSHIFT(1, 31)) == LSHIFT(1, 31)) {
isNegative = !isNegative;
dividend = addOne(NOT(dividend));
}
if (AND(divisor, LSHIFT(1, 31)) === LSHIFT(1, 31)) {
isNegative = !isNegative;
divisor = addOne(NOT(divisor));
}
let quotient = 0;
let r = null;
for (let i = 30; i >= 0; i = subtractOne(i)) {
r = LSHIFT(divisor, i);
if (r < Number.MAX_VALUE && r >= 0) {
if (r <= dividend) {
quotient = OR(quotient, LSHIFT(1, i));
dividend = subtract(dividend, r);
}
}
}
if (isNegative) {
quotient = addOne(NOT(quotient));
}
return quotient;
}