Uczymy się rozpoznawać pozycję pierwszego „ustawionego” bitu, czyli pierwszy bit o wartości 1. Do dzieła!
Najpierw zobaczmy czym jest pozycja i waga oraz liczba binarna (raczej przypomnijmy sobie):
Pozycje 3 2 1 0
Wagi: ( 8 ) ( 4 ) ( 2 ) ( 1 )
Liczba (8): 1 0 0 0
Baza: 2
Wartość: 1*2^3 - - -
Tak działają liczby binarne. Pozycje liczymy od 0 od prawej, wagi to baza^pozycja, wartość to cyfra * waga (dotyczy to wszystkich pozycyjnych systemów liczbowych z dowolną bazą, sprawdźmy dziesiętny sobie).
Ok, wypiszmy sobie wagi od pozycji 0 do 4 czyli od 1 do 16:
let num = 1;
while(num <= 16){
console.log(num);
num = num << 1;
}
// 1
// 2
// 4
// 8
// 16
Nie jest to trudne – wystarczy zacząć od liczby 1 i przesuwać bitowo o 1. Przykład:
Pozycje 3 2 1 0
Wagi: ( 8 ) ( 4 ) ( 2 ) ( 1 )
Liczba (1): 0 0 0 1
Liczba << 1: 0 0 1 0
Liczba << 1: 0 1 0 0
Liczba << 1: 1 0 0 0
Ok, a jak sprawdzić, czy dany bit jest włączony? Sprawdźmy, czy 8 ma bit 8 włączony:
console.log(8 & 8); //8
console.log(8 & 1); //0
console.log(9 & 8); //8
console.log(9 & 1); //1
8 ma włączony bit 8 (& maska 8 różne od 0) i wyłączony bit 1. 9 ma zarówno włączone bity i 8 i 1 (& maska różna od 0).
W ramach ćwiczenia proponuję to sobie rozpisać z kartką papieru. Ja natomiast przedstawiam już naszą funkcję:
function positionOfFirstSetBit(num, max=15){
let mask = 1;
let pos = 0;
//position is zero-indexed counted from right
while(pos !== max){
if((num & mask) !== 0){
return pos;
}
pos++;
mask = mask << 1;
}
return -1;
}
console.log(positionOfFirstSetBit(8));
//3
console.log(positionOfFirstSetBit(9));
//0
Ok, zobaczmy:
Pozycje 3 2 1 0
Wagi: ( 8 ) ( 4 ) ( 2 ) ( 1 )
Liczba (8): 1 0 0 0
Liczba (9): 1 0 0 1
Więcej bitowych już niedługo.