0

The function below converts from decimal to densely-packed BCD. I need help in reverse engineering this function that converts it from densely-packed BCD to decimal in JavaScript. However, it would not produce correct results for 3 or more decimal digits when a densely-packed BCD is inputted. The input must be densely-paced BCD and the output must work for 3 and more decimal digits.

function dec_to_densely(x, packed){
const holder = packed.split("");
let densely_packed = new Array(10);
let merge = new Array(10000);


if (x.length % 3 != 0) {
    if (x.length % 3 == 1){
        for (let i = 0; i < 8; i++){
            holder.unshift(0);
        }
    }

    else {
        for (let i = 0; i < 4; i++){
            holder.unshift(0);
        }
    }
}

while (holder.length > 0) {
    densely_packed[5] = holder[7];
    densely_packed[9] = holder[11];

    //000
    if (holder[0] == '0' && holder[4] == '0' && holder[8] == '0') {
        for (let i = 0; i < 3; i++){
            densely_packed[i] = holder[i + 1];
        }

        for (let i = 3; i < 5; i++){
            densely_packed[i] = holder[i + 2];
        }

        densely_packed[6] = '0';

        for (let i = 7; i < 10; i++){
            densely_packed[i] = holder[i + 2];
        }
    }

    //001
    else if (holder[0] == '0' && holder[4] == '0' && holder[8] == '1') {
        for (let i = 0; i < 3; i++){
            densely_packed[i] = holder[i + 1];
        }

        for (let i = 3; i < 5; i++){
            densely_packed[i] = holder[i + 2];
        }

        densely_packed[6] = '1';
        densely_packed[7] = '0';
        densely_packed[8] = '0';
    }

    //010
    else if (holder[0] == '0' && holder[4] == '1' && holder[8] == '0') {
        for (let i = 0; i < 3; i++){
            densely_packed[i] = holder[i + 1];
        }
        densely_packed[3] = holder[9];
        densely_packed[4] = holder[10];
        densely_packed[6] = '1';
        densely_packed[7] = '0';
        densely_packed[8] = '1';
    }

    //011
    else if (holder[0] == '0' && holder[4] == '1' && holder[8] == '1') {
        for (let i = 0; i < 3; i++){
            densely_packed[i] = holder[i + 1];
        }
        densely_packed[3] = '1';
        densely_packed[4] = '0';
        densely_packed[6] = '1';
        densely_packed[7] = '1';
        densely_packed[8] = '1';
    }

    //100
    else if (holder[0] == '1' && holder[4] == '0' && holder[8] == '0') {
        densely_packed[0] = holder[9];
        densely_packed[1] = holder[10];
        densely_packed[2] = holder[3];
        densely_packed[3] = holder[5];
        densely_packed[4] = holder[6];
        densely_packed[6] = '1';
        densely_packed[7] = '1';
        densely_packed[8] = '0';
    }

    //101
    else if (holder[0] == '1' && holder[4] == '0' && holder[8] == '1') {
        densely_packed[0] = holder[5];
        densely_packed[1] = holder[6];
        densely_packed[2] = holder[3];
        densely_packed[3] = '0';
        densely_packed[4] = '1';
        densely_packed[6] = '1';
        densely_packed[7] = '1';
        densely_packed[8] = '1';
    }

    //110
    else if (holder[0] == '1' && holder[4] == '1' && holder[8] == '0') {
        densely_packed[0] = holder[9];
        densely_packed[1] = holder[10];
        densely_packed[2] = holder[3];
        densely_packed[3] = '0';
        densely_packed[4] = '0';
        densely_packed[6] = '1';
        densely_packed[7] = '1';
        densely_packed[8] = '1';
    }
    
    //111
    else if (holder[0] == '1' && holder[4] == '1' && holder[8] == '1') {
        densely_packed[0] = '0';
        densely_packed[1] = '0';
        densely_packed[2] = holder[3];
        densely_packed[3] = '1';
        densely_packed[4] = '1';
        densely_packed[6] = '1';
        densely_packed[7] = '1';
        densely_packed[8] = '1';
    }

    merge = merge.concat(densely_packed);

    for (let i = 0; i < 12; i++){
        holder.shift()
    }

}

let dpacked = merge.join("");
return packed;
}
alxyzzles
  • 1
  • 2

0 Answers0