Przejdź do głównej zawartości

Bug #095

🪲 Znajdź buga

console.log(
8 << 3
)
console.log(
8 << 35
)
console.log(
0b00000000000000000000000000001000
)
console.log(
0b00000000000000000000000001000000
)

Jakie wartości zostaną zalogowane do konsoli i dlaczego?

🧪 Rozwiązanie

console.log(
8 << 3
) // 64
console.log(
8 << 35
) // 64
console.log(
0b00000000000000000000000000001000
) // 8
console.log(
0b00000000000000000000000001000000
) // 64

Operator przesunięcia w lewo << pozwala na modyfikację bitów poprzez ich przesunięcie w lewo o zadaną wartość.

Zwracana wartość jest w postaci dziesiętnej (decymalnej).

Dziesiętna liczba 8 to w 32 bitowym zapisie binarnym 00000000000000000000000000001000.

W JavaScript, zapis binarny poprzedzany jest prefiksem 0b.

Binarny (dwójkowy) zapis 1000 jest więc równy decymalnej (dziesiętnej) liczbie 8.

W systemie dwójkowym podstawą do potęgowania liczby jest 2.

Każdy ze znaków liczby liczony od prawej, to potęgowanie o rosnącym o 1 wykładniku, zaczynając od 0.

Binarny 1000 to 23 czyli 8.

W systemie dziesiętnym podstawą do potęgowania liczby jest 10.

Decymalny 1000 to 103 czyli 1000.

8 << 3 oznacza chęć przesunięcia binarnego zapisu decymalnej ósemki w lewo o trzy bity.

Z 1000 powstaje więc 1000000.

Binarne 1000000 to 26 czyli decymalne 64.

Co ciekawe, 8 << 35 również zwraca 64.

Ponieważ standardowy zapis liczbowy w JavaScript jest zawarty w 32 bitach, chcąc przesunąć zapis liczbowy o 35 miejsc, dochodzimy do końca 32 bitowego zapisu i wracamy na początek.

Przesunięcie o 35 miejsc to tak naprawdę przesunięcie o 35 - 32, czyli de facto 3 miejsca.

8 << 3 jest więc równe 8 << 35, 8 << 67, 8 << 99, itd. ponieważ zwiększamy przesunięcie o 32 bity czyli pełny ciąg.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js