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.