Kontynuujemy naukę zagadnień bitwise w JS. W JS, żeby nam żaden using namespace std ani inny printf nie przeszkadzał. PHP też by obleciał, ale tam jest znak dolara, też straszny.

Funkcja konwersji z poprzedniej lekcji:

function decimalToBinRec(num){

    let binaryArr = [];

    function _decToBinRec(num){
        if(num <= 0)
            return;

        binaryArr.unshift(num % 2);
        _decToBinRec(Math.floor(num / 2));
    }
    
    _decToBinRec(num);

    return "0b" + binaryArr.join("");
}

Ok, fajnie. To teraz odpowiedzmy sobie na pytanie jaka jest różnica pomiędzy tymi liczbami binarnymi:

10 (2 w dziesiętnym)
0000 0000 0000 0010 (2 w dziesiętnym)
0000 0000 0000 0000 0000 0000 0000 0010 (2 w dziesiętnym)

No żadna różnica. Tylko jeden reprezentuje int16, drugi int32. To sobie coś takiego napiszmy:

function decimalToBinInt16(num){

    let binaryArr = [];

    while(num > 0){

        binaryArr.unshift(num % 2);
        num = Math.floor(num / 2);

    }

    let leadingZerosArr = new Array(16 - binaryArr.length).fill(0)

    let outputArr = [...leadingZerosArr, ...binaryArr];

    return "0b" + outputArr.join("");
}

To nam da odpowiednią ilość zer tak, aby w sumie cyfr było 16. To teraz 32:

function decimalToBinInt32(num){

    let binaryArr = [];

    while(num > 0){

        binaryArr.unshift(num % 2);
        num = Math.floor(num / 2);

    }

    let leadingZerosArr = new Array(32 - binaryArr.length).fill(0)

    let outputArr = [...leadingZerosArr, ...binaryArr];

    return "0b" + outputArr.join("");
}

Ok, fajnie, ale mamy taką funkcję jak Math.clz32 (count leading zeros for integer32):

Math.clz32(2);
//30

Ona nam pokazuje ile dana liczba w binarnym będzie mieć 0 zanim się tam coś zacznie dziać. Zatem:

function decimalToBinInt32_v2(num){

    
    let leadingZerosArr = new Array(Math.clz32(num))
    .fill(0);
    
    let binaryArr = [];


    while(num > 0){

        binaryArr.unshift(num % 2);
        num = Math.floor(num / 2);

    }

    let outputArr = [...leadingZerosArr, ...binaryArr];

    return "0b" + outputArr.join("");
}

Albo rekurencyjnie:

function decimalToBinInt32Rec(num){

    let binaryArr = [];

    let leadingZerosArr = new Array(Math.clz32(num))
                                            .fill(0); 

    function _decToBinRec(num){
        if(num <= 0)
            return;

        binaryArr.unshift(num % 2);
        _decToBinRec(Math.floor(num / 2));
    }
    
    _decToBinRec(num);

    let outputArr = [...leadingZerosArr, ...binaryArr];

    return "0b" + outputArr.join("");
}

Liczby na komputerze są przechowywane w określonej tablicy, mającej swoją długość. W związku z tym muszą mieć te leading zeros.

Więcej bitwise już wkrótce!