Pierwsza konwersja binarnych na dziesiętne z możliwością obsługi liczb dodatnich lub ujemnych. Do dzieła.

Na początku podejście w reprezentacji liczb „oznakowanych”, czyli sign and magnitude. Pierwsza liczba (od lewej) to + (0) lub – (1). Reszta normalnie:

0110 -> + 110 -> +6

1110 -> - 110 -> -6

Oczywiście to podejście ma jeden poważny problem:

0000 -> + 000 -> +0

1000 -> - 000 -> -0

Czyli mamy plus zero i minus zero. No ale trudno. Oto nasza poprzednia funkcja do liczb unsigned:

function binaryToDecimal(binArr){

    let base = 2;
    let position = 0;

    let weight;

    let decimalNumber = 0;

    while(binArr.length > 0){
        
        let lastDigit = binArr.pop();

        weight = Math.pow(base, position);

        decimalNumber += lastDigit * weight;

        position++;
        
    }

    return decimalNumber;
}

Możemy to przerobić, aby liczby signed w notacji sign and magnitude były obsługiwane:

function bin2decSM(signedArr){

    let sign = signedArr[0];

    function _bin2dec(binArr){

        let base = 2;
        let position = 0;
    
        let weight;
    
        let decimalNumber = 0;
    
        while(binArr.length > 0){
    
            let lastDigit = binArr.pop();
    
            weight = Math.pow(base, position);
    
            decimalNumber += lastDigit * weight;
    
            position++;
            
        }
    
        return decimalNumber;
    }

    let number = _bin2dec(signedArr.slice(1));

    return sign === 0 ? number : number * -1;
}

console.log(bin2decSM([0,1,1,0]));
//6

console.log(bin2decSM([1,1,1,0]));
//-6

Przesadnie trudne to nie jest.