Je suis quelqu'un qui écrit du code juste pour le plaisir et qui ne s'est pas vraiment plongé dans un contexte académique ou professionnel, donc des trucs comme ces opérateurs au niveau du bit m'échappent vraiment.
Je lisais un article sur JavaScript, qui prend apparemment en charge les opérations au niveau du bit. Je continue de voir cette opération mentionnée à certains endroits, et j'ai essayé de lire pour savoir de quoi il s'agit exactement, mais je ne semble tout simplement pas la comprendre. Alors que sont-ils? Des exemples clairs seraient formidables! :RÉ
Encore quelques questions - quelles sont les applications pratiques des opérations au niveau du bit? Quand pourriez-vous les utiliser?
javascript
boolean
bitwise-operators
boolean-logic
Cliquez sur
la source
la source
Réponses:
Puisque personne n'a abordé le sujet de leur utilité:
J'utilise beaucoup les opérations au niveau du bit lorsque je travaille avec des indicateurs. Par exemple, si vous souhaitez passer une série d'indicateurs à une opération (par exemple
File.Open()
, avec le mode lecture et le mode écriture tous deux activés), vous pouvez les transmettre sous la forme d'une valeur unique. Ceci est accompli en attribuant à chaque drapeau possible son propre bit dans un ensemble de bits (octet, court, entier ou long). Par exemple:Donc si vous voulez passer en lecture ET en écriture, vous passerez (READ | WRITE) qui combine ensuite les deux
Qui peut alors être décrypté à l'autre extrémité comme:
qui vérifie
qui retourne
qui n'est pas 0, donc l'indicateur spécifie READ.
Vous pouvez utiliser XOR pour basculer entre différents bits. Je l'ai utilisé lors de l'utilisation d'un drapeau pour spécifier des entrées directionnelles (haut, bas, gauche, droite). Par exemple, si un sprite se déplace horizontalement et que je veux qu'il se retourne:
Je XOR simplement la valeur actuelle avec (GAUCHE | DROITE) qui va désactiver la GAUCHE et la DROITE, dans ce cas.
Le décalage de bits est utile dans plusieurs cas.
est le même que
si vous avez besoin de multiplier rapidement par une puissance de deux, mais faites attention au décalage d'un bit dans le bit supérieur - cela rend le nombre négatif à moins qu'il ne soit non signé. C'est également utile pour traiter différentes tailles de données. Par exemple, lire un entier de quatre octets:
En supposant que A est l'octet le plus significatif et D le moins. Cela finirait par:
Les couleurs sont souvent stockées de cette façon (l'octet le plus significatif étant ignoré ou utilisé comme alpha):
Pour retrouver les valeurs, déplacez simplement les bits vers la droite jusqu'à ce qu'il soit en bas, puis masquez les bits d'ordre supérieur restants:
0xFF
est le même que11111111
. Donc, essentiellement, pour Red, vous feriez ceci:la source
Il convient de noter que les tables de vérité à un seul bit répertoriées comme autres réponses ne fonctionnent que sur un ou deux bits d'entrée à la fois. Que se passe-t-il lorsque vous utilisez des entiers, tels que:
La réponse réside dans l'expansion binaire de chaque entrée:
Chaque paire de bits dans chaque colonne est exécutée via la fonction "ET" pour donner le bit de sortie correspondant sur la ligne du bas. La réponse à l'expression ci-dessus est donc 4. La CPU a effectué (dans cet exemple) 8 opérations "ET" séparées en parallèle, une pour chaque colonne.
Je mentionne cela parce que je me souviens encore d'avoir ce "AHA!" moment où j'ai appris cela il y a de nombreuses années.
la source
Les opérateurs au niveau du bit sont des opérateurs qui travaillent petit à petit.
AND est 1 uniquement si ses deux entrées sont 1.
OR vaut 1 si une ou plusieurs de ses entrées sont 1.
XOR est 1 seulement si exactement l'une de ses entrées est 1.
NOT est 1 uniquement si son entrée est 0.
Celles-ci peuvent être mieux décrites comme des tables de vérité. Les possibilités d'entrées sont en haut et à gauche, le bit résultant est l'une des quatre (deux dans le cas de NOT car il n'a qu'une seule entrée) valeurs affichées à l'intersection des deux entrées.
Un exemple est que si vous ne voulez que les 4 bits inférieurs d'un entier, vous ET avec 15 (binaire 1111) ainsi:
la source
Voici les opérateurs au niveau du bit, tous pris en charge en JavaScript:
op1 & op2
- L'AND
opérateur compare deux bits et génère un résultat de 1 si les deux bits sont 1; sinon, il renvoie 0.op1 | op2
- l'OR
opérateur compare deux bits et génère un résultat de 1 si les bits sont complémentaires; sinon, il renvoie 0.op1 ^ op2
- L'EXCLUSIVE-OR
opérateur compare deux bits et renvoie 1 si l'un des bits est 1 et il donne 0 si les deux bits sont 0 ou 1.~op1
- L'COMPLEMENT
opérateur permet d'inverser tous les bits de l'opérande.op1 << op2
- L'SHIFT LEFT
opérateur déplace les bits vers la gauche, rejette le bit le plus à gauche et attribue au bit le plus à droite une valeur de 0. Chaque déplacement vers la gauche multiplie effectivement op1 par 2.op1 >> op2
- L'SHIFT RIGHT
opérateur déplace les bits vers la droite, rejette le bit le plus à droite et attribue au bit le plus à gauche une valeur de 0. Chaque déplacement vers la droite divise effectivement op1 en deux. Le bit de signe le plus à gauche est conservé.op1 >>> op2
- L' opérateurSHIFT RIGHT
-ZERO FILL
déplace les bits vers la droite, rejette le bit le plus à droite et attribue au bit le plus à gauche une valeur de 0. Chaque déplacement vers la droite divise effectivement op1 en deux. Le bit de signe le plus à gauche est ignoré.la source
1 | 1
donne1
et non0
, et comment|
est alors censé être différent de^
. J'ai dû utiliser ce Q / A comme cible en double il y a quelques jours, et je souhaitais qu'après 10 ans, on ait un duplicata canonique plus clair pour ce genre de questions.Pour le décomposer un peu plus, cela a beaucoup à voir avec la représentation binaire de la valeur en question.
J'espère que cela t'aides.
la source
|
est une opération OR?x | y = 1000 0001 |
partieLorsque le terme «bit à bit» est mentionné, il est parfois précisé qu'il ne s'agit pas d'un opérateur «logique».
Par exemple, en JavaScript, les opérateurs de bits traitent leurs opérandes comme une séquence de 32 bits (zéros et uns) ; Pendant ce temps, les opérateurs logiques sont généralement utilisés avec des valeurs booléennes (logiques) mais peuvent fonctionner avec des types non booléens.
Prenons l'exemple de expr1 && expr2.
Comme d'autres l'ont noté, 2 & 4 est un ET au niveau du bit, donc il retournera 0.
Vous pouvez copier ce qui suit dans test.html ou quelque chose et tester:
la source
opérations :
ET au niveau du bit
OU au niveau du bit
pas au niveau du bit
XOR au niveau du bit
etc
Élément de liste
Par exemple.
Utilisations de l'opérateur bit à bit
Par exemple.
Par exemple.
if else
instructionPar exemple.
Par exemple.
le décalage au niveau du bit ne fonctionne qu'avec le nombre + ve
Il existe également un large éventail d'utilisation de la logique binaire
la source
The left-shift and right-shift operators are equivalent to multiplication and division by x * 2y respectively.
C'est vrai! muyiy.cn/question/program/102.htmlCela pourrait aider à penser de cette façon. Voici comment fonctionne AND (&):
Il dit essentiellement que sont ces deux nombres, donc si vous avez deux nombres 5 et 3, ils seront convertis en binaire et l'ordinateur pensera
sont tous les deux un: 00000001 0 est faux, 1 est vrai
Ainsi, le ET de 5 et 3 est un. L'opérateur OR (|) fait la même chose sauf qu'un seul des nombres doit être un pour afficher 1, pas les deux.
la source
J'entendais sans cesse parler de la lenteur des opérateurs JavaScript binaires. J'ai fait quelques tests pour mon dernier article de blog et j'ai découvert qu'ils étaient 40% à 80% plus rapides que l'alternative arithmétique dans plusieurs tests. Peut-être étaient-ils lents. Dans les navigateurs modernes, je les adore.
J'ai un cas dans mon code qui sera plus rapide et plus facile à lire à cause de cela. Je vais garder les yeux ouverts pour en savoir plus.
la source