Où voudrais-je utiliser un opérateur au niveau du bit en JavaScript?
J'ai lu "ce sont des opérateurs au niveau du bit?', donc je sais ce opérateurs au niveau du bit mais je ne suis toujours pas clair sur la façon dont on pourrait les utiliser. Quelqu'un peut-il offrir à tous des exemples du monde réel de l'endroit où un opérateur au niveau du bit serait utile en JavaScript?
Grâce.
Edit:
Juste de creuser dans le jQuery source j'ai trouvé quelques endroits où les opérateurs sur les bits sont utilisés, par exemple: (uniquement le & operator)
//Line 2756:
event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
//Line 2101
var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
Vous devez vous connecter pour publier un commentaire.
Exemple:
Analyse valeur hexadécimale pour obtenir les valeurs de couleurs RVB.
Je fortement utiliser les opérateurs sur les bits pour les conversions dans la production de scripts, parce que parfois ils sont beaucoup plus rapides que leurs
Math
ouparseInt
équivalents.Le prix que j'ai payer est la lisibilité du code. Donc, j'utilise généralement des
Math
au développement et au niveau du bit dans la production.Vous pouvez trouver quelques astuces sur la performance jsperf.com.
Comme vous pouvez le voir, les navigateurs ne pas optimiser
Math.ceil
etparseInt
pendant des années, j'ai donc prévoir au niveau du bit sera plus rapide et plus courte façon de faire les choses dans furure ainsi.Quelques lectures complémentaires sur le sujet DONC...
Bonus: feuille de triche pour
| 0
: un moyen facile et rapide de convertir tout entier:et un peu de magie pour moi:
'use strict'; Function.prototype.valueOf = function() {return 2;};console.log(( (function(){})|0 ) === 0);
, et vous verrez que vos deux derniers exemples ne sont pas correctes et ainsi de suite.En JavaScript, vous pouvez utiliser une double négation binaire (
~~n
) comme un remplacement pourMath.floor(n)
(sin
est un nombre positif) ouparseInt(n, 10)
(même sin
est négatif).n|n
etn&n
toujours obtenir les mêmes résultats que~~n
.Une seule négation binaire (
~
) calcule-(parseInt(n, 10) + 1)
, de sorte que deux au niveau du bit négations sera de retour-(-(parseInt(n, 10) + 1) + 1)
.Il convient de noter que de ces trois solutions,
n|n
qui semble être le plus rapide.Mise à jour: Plus précise des repères ici: http://jsperf.com/rounding-numbers-down
(Posté sur Plus étrange langage)
n << 0;
est maintenant le plus rapide sur les V8.n | 0;
est très loin derrière et c'est ce que j'utilise.n >>> 0
?Un la vraie vie exemple :
^
XOR au niveau du bit en tant queI/O
togglerUtilisé comme
value ^= 1
va changer à chaque appel de lavalue
à0, 1, 0, 1 ...
JS:
HTML:
Donné les avancées de Javascript est de faire (surtout avec nodejs qui permet la programmation côté serveur avec js), il est de plus en plus complexes et code en JS. Voici quelques cas où j'ai utilisé les opérateurs au niveau du bit:
Adresse IP opérations:
Note: ceci est un code en C, mais le JS est presque identique
Découvrez la l'entrée de wikipedia sur ce
De dire si un nombre est impair:
Plus rapide que le module à usage où la performance vraiment compte!
Quelques autres exemples de la façon d'utiliser not au niveau du bit et double not au niveau du bit:
Sol
Vérifier si indexOf retourné à -1 ou non
Vous pouvez les utiliser pour retourner une valeur booléenne:
C'est un peu idiot, bien que pour la plupart des opérateurs au niveau du bit n'ont de nombreuses applications en Javascript.
Ennuyé pour écrire
pour vérifier si quelque chose est à l'intérieur d'un tableau?
Vous pouvez utiliser l'opérateur au niveau du bit
~
comme suit:arr.includes
peut également être utilisé depuis ES2016Masques de bits.
Largement utilisé, par exemple, en JS événements.
Je l'ai utilisé une fois pour un les autorisations de widget. Des autorisations de fichier unix sont un masque de bits, donc, pour l'analyser, vous devez utiliser les opérations sur les bits.
Je suis en les utilisant pour aplatir trois numéros en 1 comme un moyen de stocker les tableaux multidimensionnels dans un Uint16Array. Voici un extrait d'un voxel jeu, je suis en développement:
JS:
65535
la valeur pourquoi les 5 et 10 dans(x << 5) + (z << 10)
Cette réponse contient des explications de Marc réponse.
Par la lecture de ces explications et l'exécution du fragment de code suivant, une idée peut être acquise.
JS:
Ils semblent être très utile lorsque vous travaillez avec des valeurs hexadécimales et de bits. Depuis le 4 bits peut représenter de 0 à F.
1111 = F
1111 1111 = FF.
Exemple à l'aide de Node.js
En supposant que vous avez eu un fichier (appelé multiply.js) avec ces contenus, vous pouvez exécuter
et obtenir un résultat cohérent avec l'aide de l'opérateur de multiplication sur les deux mêmes numéros. Le décalage de bits se passe dans le
Mulitply
fonction est un exemple de la façon de prendre le masque de bits représentant le nombre et l'utiliser pour inverser les bits dans un autre numéro pour les opérations rapides.Je viens de trouver cette question d'essayer de confirmer si le bit à bit
AND
opérateur a également été&
en Javascript.Depuis que vous avez demandé un exemple:
Il remplit l'état des boutons avec jQuery donné un masque de bits de la valeur d'un champ caché:
none
=0
user
=1
administrator
=2
user
+administrator
=3