(17.1) Add Without Plus

Write a function that adds two numbers. You should not use + or any arithmetic operators.

related blog post

function sumTwoNumbers(numA: number, numB: number): number {
    let binaryNumA = numberToBinary(numA);
    let binaryNumB = numberToBinary(numB);
    let binaryResult = sumTwoBinaryNumbers(binaryNumA, binaryNumB);

    return binaryToNumber(binaryResult);
}

function numberToBinary(input: number): string {
    return (input).toString(2);
}

function binaryToNumber(input: string): number {
    return parseInt(input, 2);
}

function sumTwoBinaryNumbers(numA: string, numB: string): string {
    let arrayLonger = (numA.length > numB.length ? numA : numB).split('').reverse();
    let arrayShorter = (numA.length <= numB.length ? numA : numB).split('').reverse();
    let arrayResult: string[] = [];

    let carry = false;

    arrayLonger.forEach((element, index) => {
        if (!carry) {
            if (element === '1' && arrayShorter[index] === '1') {
                carry = true;
                arrayResult.push('0');
            } else if (element === '0' && (arrayShorter[index] === '0' || arrayShorter[index] === undefined)) {
                arrayResult.push('0');
            } else {
                arrayResult.push('1');
            }
        } else {
            if (element === '1' && arrayShorter[index] === '1') {
                carry = true;
                arrayResult.push('1');
            } else if (element === '0' && (arrayShorter[index] === '0' || arrayShorter[index] === undefined)) {
                arrayResult.push('1');
                carry = false;
            } else {
                carry = true;
                arrayResult.push('0');
            }
        }
    });
    if (carry) arrayResult.push('1');
    
    return arrayResult.reverse().join("");
}