L’opérateur NOT bitwise “~” (ou tilde) en Javascript

L’opérateur NOT bitwise est en général utilisé comme un Math.floor(), en plus rapide. Mais il a une propriété amusante sur les entiers, il les transforme en -(N+1), où N est l’entier en question.

La conséquence ?

~-2 => 1
~-1 => 0
~0 => -1
~1 => -2
~2 => -3

Or, en javascript on a un problème avec le fait que la seule option pour rechercher un élément dans un ensemble soit des fonctions comme indexOf qui retournent l’index de ce qu’elles trouvent ou -1, les chiennes.

Ce qui fait que:

if ("truc".indexOf('t')) {
    console.log('trouvé')
}

Ne va rien afficher, car 't' est à la première place, renvoyant l’index 0, qui est “faux” dans un contexte booléan. Mais :

if ("truc".indexOf('z')) {
    console.log('trouvé')
}

Va afficher “trouvé” car la fonction renvoit -1 quand elle ne trouve rien. C’est nul. On se retrouve donc à faire du :

if ("truc".indexOf('z') > -1) {
    console.log('trouvé')
}

Ce qui est moche comme ça en peut plus. Mais avec l’opérateur bitwise, 0 devient -1 (donc vrai, comme tous les autres chiffres) et -1 devient zéro.

if (~"truc".indexOf('t')) {
    console.log('trouvé')
}

Et là ça va marcher !

Vous venez officiellement de passer 10 minutes sur un article qui va vous faire gagner 1 seconde sur l’ensemble de votre vie. En fait même pas, car pour garder votre code lisible, je vous recommande de ne pas utiliser cette technique.

De rien.

No related posts.

flattr this!

11 comments

  1. Ce petit coin de nature est l’endroit idéal pour poser un lien vers un entretien rigolo avec Douglas Crockford: http://jaxenter.com/douglas-crockford-java-was-a-colossal-failure-javascript-is-succeeding-because-it-works-45928.html

  2. “En fait même pas, car pour garder votre code lisible, je vous recommande de ne pas utiliser cette technique. ”

    Haha :D

  3. Raiden313

    Merci !
    Je jure de l’utiliser à déraison.

  4. Freak0

    Yo, commentaire qui n’a rien à voir mais qui peux vous donner du grains à moudre : http://phpsadness.com/

  5. Vous faites pas des tampons “Merci bibi” pour les articles ? =D

  6. On préfère les coms, ça nous remonte le moral et c’est cumulatif.

  7. bussiere

    Perso en java ca doit etre faisable en javascript aussi ca permet de faire des for stylés :

    for (int i = 0;i < 5; i = -(~i))
    {
    System.out.println(i);
    }

  8. Voilà qui est bien amusant. Mais savez-vous au moins pourquoi l’opérateur ~ est équivalent à -(N+1) ?

    Eh bien moi je sais. Ça vient de la façon dont le n’ordinateur représente les entiers signés en binaire.

    Hop, c’est par ici.

  9. Tiens, tout ça marche aussi en Python :-P

    &gt;&gt;&gt; a = 'truc'
    &gt;&gt;&gt; if a.index('t'):
    ...     print 'go'
    ...     
    ... 
    &gt;&gt;&gt; ~1
    -2
    &gt;&gt;&gt; ~2
    -3
  10. J’aime bien l’article et sa conclusion

  11. Oui mais bon en Python on utilise “in” pour ça, et tous les opérateurs logiques retourne soit un booléen soit un des objets testés donc y a pas de piège.

Flux RSS des commentaires

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Jouer à mario en attendant que les autres répondent