|
|
"use strict"; |
|
|
exports.__esModule = true; |
|
|
exports.substractArrayInt64 = exports.fromNumberToArrayInt64 = exports.trimArrayIntInplace = exports.substractArrayIntToNew = exports.addOneToPositiveArrayInt = exports.addArrayIntToNew = void 0; |
|
|
function addArrayIntToNew(arrayIntA, arrayIntB) { |
|
|
if (arrayIntA.sign !== arrayIntB.sign) { |
|
|
return substractArrayIntToNew(arrayIntA, { sign: -arrayIntB.sign, data: arrayIntB.data }); |
|
|
} |
|
|
var data = []; |
|
|
var reminder = 0; |
|
|
var dataA = arrayIntA.data; |
|
|
var dataB = arrayIntB.data; |
|
|
for (var indexA = dataA.length - 1, indexB = dataB.length - 1; indexA >= 0 || indexB >= 0; --indexA, --indexB) { |
|
|
var vA = indexA >= 0 ? dataA[indexA] : 0; |
|
|
var vB = indexB >= 0 ? dataB[indexB] : 0; |
|
|
var current = vA + vB + reminder; |
|
|
data.push(current >>> 0); |
|
|
reminder = ~~(current / 0x100000000); |
|
|
} |
|
|
if (reminder !== 0) { |
|
|
data.push(reminder); |
|
|
} |
|
|
return { sign: arrayIntA.sign, data: data.reverse() }; |
|
|
} |
|
|
exports.addArrayIntToNew = addArrayIntToNew; |
|
|
function addOneToPositiveArrayInt(arrayInt) { |
|
|
arrayInt.sign = 1; |
|
|
var data = arrayInt.data; |
|
|
for (var index = data.length - 1; index >= 0; --index) { |
|
|
if (data[index] === 0xffffffff) { |
|
|
data[index] = 0; |
|
|
} |
|
|
else { |
|
|
data[index] += 1; |
|
|
return arrayInt; |
|
|
} |
|
|
} |
|
|
data.unshift(1); |
|
|
return arrayInt; |
|
|
} |
|
|
exports.addOneToPositiveArrayInt = addOneToPositiveArrayInt; |
|
|
function isStrictlySmaller(dataA, dataB) { |
|
|
var maxLength = Math.max(dataA.length, dataB.length); |
|
|
for (var index = 0; index < maxLength; ++index) { |
|
|
var indexA = index + dataA.length - maxLength; |
|
|
var indexB = index + dataB.length - maxLength; |
|
|
var vA = indexA >= 0 ? dataA[indexA] : 0; |
|
|
var vB = indexB >= 0 ? dataB[indexB] : 0; |
|
|
if (vA < vB) |
|
|
return true; |
|
|
if (vA > vB) |
|
|
return false; |
|
|
} |
|
|
return false; |
|
|
} |
|
|
function substractArrayIntToNew(arrayIntA, arrayIntB) { |
|
|
if (arrayIntA.sign !== arrayIntB.sign) { |
|
|
return addArrayIntToNew(arrayIntA, { sign: -arrayIntB.sign, data: arrayIntB.data }); |
|
|
} |
|
|
var dataA = arrayIntA.data; |
|
|
var dataB = arrayIntB.data; |
|
|
if (isStrictlySmaller(dataA, dataB)) { |
|
|
var out = substractArrayIntToNew(arrayIntB, arrayIntA); |
|
|
out.sign = -out.sign; |
|
|
return out; |
|
|
} |
|
|
var data = []; |
|
|
var reminder = 0; |
|
|
for (var indexA = dataA.length - 1, indexB = dataB.length - 1; indexA >= 0 || indexB >= 0; --indexA, --indexB) { |
|
|
var vA = indexA >= 0 ? dataA[indexA] : 0; |
|
|
var vB = indexB >= 0 ? dataB[indexB] : 0; |
|
|
var current = vA - vB - reminder; |
|
|
data.push(current >>> 0); |
|
|
reminder = current < 0 ? 1 : 0; |
|
|
} |
|
|
return { sign: arrayIntA.sign, data: data.reverse() }; |
|
|
} |
|
|
exports.substractArrayIntToNew = substractArrayIntToNew; |
|
|
function trimArrayIntInplace(arrayInt) { |
|
|
var data = arrayInt.data; |
|
|
var firstNonZero = 0; |
|
|
for (; firstNonZero !== data.length && data[firstNonZero] === 0; ++firstNonZero) { } |
|
|
if (firstNonZero === data.length) { |
|
|
arrayInt.sign = 1; |
|
|
arrayInt.data = [0]; |
|
|
return arrayInt; |
|
|
} |
|
|
data.splice(0, firstNonZero); |
|
|
return arrayInt; |
|
|
} |
|
|
exports.trimArrayIntInplace = trimArrayIntInplace; |
|
|
function fromNumberToArrayInt64(out, n) { |
|
|
if (n < 0) { |
|
|
var posN = -n; |
|
|
out.sign = -1; |
|
|
out.data[0] = ~~(posN / 0x100000000); |
|
|
out.data[1] = posN >>> 0; |
|
|
} |
|
|
else { |
|
|
out.sign = 1; |
|
|
out.data[0] = ~~(n / 0x100000000); |
|
|
out.data[1] = n >>> 0; |
|
|
} |
|
|
return out; |
|
|
} |
|
|
exports.fromNumberToArrayInt64 = fromNumberToArrayInt64; |
|
|
function substractArrayInt64(out, arrayIntA, arrayIntB) { |
|
|
var lowA = arrayIntA.data[1]; |
|
|
var highA = arrayIntA.data[0]; |
|
|
var signA = arrayIntA.sign; |
|
|
var lowB = arrayIntB.data[1]; |
|
|
var highB = arrayIntB.data[0]; |
|
|
var signB = arrayIntB.sign; |
|
|
out.sign = 1; |
|
|
if (signA === 1 && signB === -1) { |
|
|
var low_1 = lowA + lowB; |
|
|
var high = highA + highB + (low_1 > 0xffffffff ? 1 : 0); |
|
|
out.data[0] = high >>> 0; |
|
|
out.data[1] = low_1 >>> 0; |
|
|
return out; |
|
|
} |
|
|
var lowFirst = lowA; |
|
|
var highFirst = highA; |
|
|
var lowSecond = lowB; |
|
|
var highSecond = highB; |
|
|
if (signA === -1) { |
|
|
lowFirst = lowB; |
|
|
highFirst = highB; |
|
|
lowSecond = lowA; |
|
|
highSecond = highA; |
|
|
} |
|
|
var reminderLow = 0; |
|
|
var low = lowFirst - lowSecond; |
|
|
if (low < 0) { |
|
|
reminderLow = 1; |
|
|
low = low >>> 0; |
|
|
} |
|
|
out.data[0] = highFirst - highSecond - reminderLow; |
|
|
out.data[1] = low; |
|
|
return out; |
|
|
} |
|
|
exports.substractArrayInt64 = substractArrayInt64; |
|
|
|