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