Opérations JavaScript au niveau du bit
Opérateurs bit à bit JavaScript
Operator | Name | Description |
---|---|---|
& | AND | Sets each bit to 1 if both bits are 1 |
| | OR | Sets each bit to 1 if one of two bits is 1 |
^ | XOR | Sets each bit to 1 if only one of two bits is 1 |
~ | NOT | Inverts all the bits |
<< | Zero fill left shift | Shifts left by pushing zeros in from the right and let the leftmost bits fall off |
>> | Signed right shift | Shifts right by pushing copies of the leftmost bit in from the left, and let the rightmost bits fall off |
>>> | Zero fill right shift | Shifts right by pushing zeros in from the left, and let the rightmost bits fall off |
Exemples
Operation | Result | Same as | Result |
---|---|---|---|
5 & 1 | 1 | 0101 & 0001 | 0001 |
5 | 1 | 5 | 0101 | 0001 | 0101 |
~ 5 | 10 | ~0101 | 1010 |
5 << 1 | 10 | 0101 << 1 | 1010 |
5 ^ 1 | 4 | 0101 ^ 0001 | 0100 |
5 >> 1 | 2 | 0101 >> 1 | 0010 |
5 >>> 1 | 2 | 0101 >>> 1 | 0010 |
JavaScript utilise des opérandes au niveau du bit 32 bits
JavaScript stocke les nombres sous forme de nombres à virgule flottante 64 bits, mais toutes les opérations au niveau du bit sont effectuées sur des nombres binaires 32 bits.
Avant qu'une opération au niveau du bit ne soit effectuée, JavaScript convertit les nombres en entiers signés 32 bits.
Une fois l'opération au niveau du bit effectuée, le résultat est reconverti en nombres JavaScript 64 bits.
Les exemples ci-dessus utilisent des nombres binaires non signés de 4 bits. Pour cette raison ~ 5 renvoie 10.
Comme JavaScript utilise des entiers signés 32 bits, il ne renverra pas 10. Il renverra -6.
0000000000000000000000000000101 (5)
11111111111111111111111111010 (~5 = -6)
Un entier signé utilise le bit le plus à gauche comme signe moins.
ET au niveau du bit
Lorsqu'un ET au niveau du bit est effectué sur une paire de bits, il renvoie 1 si les deux bits sont à 1.
Opération | Résultat |
---|---|
0 & 0 | 0 |
0 & 1 | 0 |
dix | 0 |
1 & 1 | 1 |
Opération | Résultat |
---|---|
1111 & 0000 | 0000 |
1111 & 0001 | 0001 |
1111 & 0010 | 0010 |
1111 & 0100 | 0100 |
OU au niveau du bit
Lorsqu'un OU au niveau du bit est effectué sur une paire de bits, il renvoie 1 si l'un des bits vaut 1 :
Opération | Résultat |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Opération | Résultat |
---|---|
1111 | 0000 | 1111 |
1111 | 0001 | 1111 |
1111 | 0010 | 1111 |
1111 | 0100 | 1111 |
XOR au niveau du bit
Lorsqu'un XOR au niveau du bit est effectué sur une paire de bits, il renvoie 1 si les bits sont différents :
Opération | Résultat |
---|---|
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
Opération | Résultat |
---|---|
1111 ^ 0000 | 1111 |
1111 ^ 0001 | 1110 |
1111 ^ 0010 | 1101 |
1111 ^ 0100 | 1011 |
AND au niveau du bit JavaScript (&)
Bitwise AND renvoie 1 uniquement si les deux bits sont 1 :
Décimal | Binaire |
---|---|
5 | 0000000000000000000000000000101 |
1 | 0000000000000000000000000000001 |
5 & 1 | 0000000000000000000000000000001 (1) |
Exemple
let x = 5 & 1;
OR au niveau du bit JavaScript (|)
Le OU au niveau du bit renvoie 1 si l'un des bits vaut 1 :
Décimal | Binaire |
---|---|
5 | 0000000000000000000000000000101 |
1 | 0000000000000000000000000000001 |
5 | 1 | 0000000000000000000000000000101 (5) |
Exemple
let x = 5 | 1;
JavaScript Bitwise XOR (^)
Bitwise XOR renvoie 1 si les bits sont différents :
Décimal | Binaire |
---|---|
5 | 0000000000000000000000000000101 |
1 | 0000000000000000000000000000001 |
5 ^ 1 | 0000000000000000000000000000100 (4) |
Exemple
let x = 5 ^ 1;
JavaScript au niveau du bit NON (~)
Décimal | Binaire |
---|---|
5 | 0000000000000000000000000000101 |
~5 | 11111111111111111111111111010 (-6) |
Exemple
let x = ~5;
JavaScript (Remplissage zéro) Décalage gauche au niveau du bit (<<)
Il s'agit d'un décalage à gauche de remplissage nul. Un ou plusieurs bits zéro sont introduits à partir de la droite et les bits les plus à gauche tombent :
Décimal | Binaire |
---|---|
5 | 0000000000000000000000000000101 |
5 << 1 | 0000000000000000000000000001010 (10) |
Exemple
let x = 5 << 1;
JavaScript (préservation des signes) Décalage vers la droite au niveau du bit (>>)
C'est un signe préservant le décalage vers la droite. Les copies du bit le plus à gauche sont insérées à partir de la gauche et les bits les plus à droite tombent :
Décimal | Binaire |
---|---|
-5 | 111111111111111111111111111011 |
-5 >> 1 | 11111111111111111111111111101 (-3) |
Exemple
let x = -5 >> 1;
JavaScript (Remplissage zéro) Décalage vers la droite (>>>)
Il s'agit d'un décalage vers la droite de remplissage nul. Un ou plusieurs bits zéro sont insérés à partir de la gauche et les bits les plus à droite tombent :
Décimal | Binaire |
---|---|
5 | 0000000000000000000000000000101 |
5 >>> 1 | 0000000000000000000000000000010 (2) |
Exemple
let x = 5 >>> 1;
Nombres binaires
Les nombres binaires avec un seul bit défini sont faciles à comprendre :
Représentation binaire | Valeur décimale |
---|---|
0000000000000000000000000000001 | 1 |
0000000000000000000000000000010 | 2 |
0000000000000000000000000000100 | 4 |
0000000000000000000000000001000 | 8 |
0000000000000000000000000010000 | 16 |
0000000000000000000000000100000 | 32 |
0000000000000000000000001000000 | 64 |
Définir quelques bits supplémentaires révèle le modèle binaire :
Représentation binaire | Valeur décimale |
---|---|
0000000000000000000000000000101 | 5 (4 + 1) |
0000000000000000000000000001101 | 13 (8 + 4 + 1) |
0000000000000000000000000101101 | 45 (32 + 8 + 4 + 1) |
Les nombres binaires JavaScript sont stockés au format complément à deux.
Cela signifie qu'un nombre négatif est le NON au niveau du bit du nombre plus 1 :
Représentation binaire | Valeur décimale |
---|---|
0000000000000000000000000000101 | 5 |
111111111111111111111111111011 | -5 |
0000000000000000000000000000110 | 6 |
111111111111111111111111111010 | -6 |
0000000000000000000000000101000 | 40 |
111111111111111111111111011000 | -40 |
Conversion de décimal en binaire
Exemple
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
Conversion binaire en décimal
Exemple
function bin2dec(bin){
return parseInt(bin, 2).toString(10);
}