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!