CodeTip #1 Trochę inne zastosowanie operatora bitowego NOT w JavaScript

Cześć !

Dziś rozpoczynam serię wpisów, która ma na celu sprzedawanie Wam małych life hacków związanych z programowaniem. Na pierwszy ogień operator bitowy NOT w JavaScript. Aha, jeszcze mała uwaga. Ten wpis podzieliłem na 2 części: sam life hack, oraz wyjaśnienie „dlaczego tak się dzieje?”. Tak więc jeśli rozumiesz zasadę, to spokojnie możesz skończyć za ok 15 linijek 🙂

Zazwyczaj w naszym kodzie JavaScript znajduje się sprawdzenie czy dany element znajduje się w tablicy. Do tego celu wykorzystujemy metodę indexOf(), która zwraca indeks elementu lub -1 w przypadku jego nieodnalezienia. Zazwyczaj taki kod wygląda tak:


if(myArray.indexOf(myElement) > -1) {
    //do something if myArray contains element
} else {
    //do something if myArray does not conatin element
}

Przejdźmy teraz do samego „haka”. Powyższy kod możemy zamienić następująco przy pomocy tytułowego bitowego operatora NOT (~). Wygląda to tak:

if(~ myArray.indexOf(myElement)) {
    //do something if myArray contains element
} else {
    //do something if myArray does not conatin element
}

Dzieje się tak, ponieważ negując wszystkie bity -1 otrzymujemy 0, które jest falsy value. Wobec tego jeżeli element nie zostanie odnaleziony, otrzymamy tak naprawdę sprawdzenie warunku od 0. Każda inna wartość będzie ów warunek spełniać.

Tu żegnam się z osobami, które ten proces zrozumiały 🙂 Na razie !

Wyjaśnienie jest ściśle związane z kodem uzupełnień U2 (zwany kodem uzupełnień do dwóch). Liczba w kodzie U2 jest reprezentowana klasycznie w systemie dwójkowym z tą różnicą, że najbardziej znaczący bit określa znak liczby:

 

  • 1 – znak (-)
  • 0 – znak (+)

Obliczenie wartości dziesiętnej nie jest trudne. Przykładowo mamy taką oto liczbę 5-bitową:

1 0 1 0 1

Schemat działania jest identyczny jak w przypadku „klasycznym”, z tą różnicą, że wartość która kryje się pod najbardziej znaczącym bitem odejmujemy. W naszym przypadku wygląda to następująco:

1 + 0 + 4 + 0 -16 = -11

W tym momencie wróćmy do naszej magicznej liczby -1. Jej reprezentacja bitowa w kodzie U2 wygląda tak:

1111 1111 1111 1111 1111 1111 1111 1111

Wobec tego jeżeli każdy bit zanegujemy otrzymamy 0 🙂

Być może takie rozwodzenie się jest głupie, no ale nic na to nie poradzę, tak już mam 😀 Co do samej konstrukcji: zapewne części z Was przypadnie to do gustu, a część uzna za zaciemnianie kodu. Mi osobiście się podobna i mam zamiar jej używać 😛

Cya !

You may also like...