javascript-algorithms

Manipulation de bits

Read this in other languages: english.

VĂ©rifier un bit (get)

Cette mĂ©thode dĂ©cale le bit correspondant (bit shifting) Ă  la position zĂ©ro. Ensuite, nous exĂ©cutons l’opĂ©ration AND avec un masque comme 0001. Cela efface tous les bits du nombre original sauf le correspondant. Si le bit pertinent est 1, le rĂ©sultat est 1, sinon le rĂ©sultat est 0.

Voir getBit.js pour plus de détails.

Mettre un bit Ă  1(set)

Cette mĂ©thode met un bit Ă  1 en fonction d’un rang (bitPosition), crĂ©ant ainsi une valeur qui ressemble Ă  00100. Ensuite, nous effectuons l’opĂ©ration OU qui met un bit spĂ©cifique en 1 sans affecter les autres bits du nombre.

Voir setBit.js pour plus de détails.

Mettre un bit Ă  0 (clear)

Cette mĂ©thode met un bit Ă  1 en fonction d’un rang (bitPosition), crĂ©ant ainsi une valeur qui ressemble Ă  00100. Puis on inverse ce masque de bits pour obtenir un nombre ressemblant Ă  11011. Enfin, l’opĂ©ration AND est appliquĂ©e au nombre et au masque. Cette opĂ©ration annule le bit.

Voir clearBit.js pour plus de détails.

Mettre Ă  jour un Bit (update)

Cette mĂ©thode est une combinaison de l’“annulation de bit” et du “forçage de bit”.

Voir updateBit.js pour plus de détails.

VĂ©rifier si un nombre est pair (isEven)

Cette mĂ©thode dĂ©termine si un nombre donnĂ© est pair. Elle s’appuie sur le fait que les nombres impairs ont leur dernier bit droit Ă  1.

Nombre: 5 = 0b0101
isEven: false

Nombre: 4 = 0b0100
isEven: true

Voir isEven.js pour plus de détails.

VĂ©rifier si un nombre est positif (isPositive)

Cette mĂ©thode dĂ©termine un le nombre donnĂ© est positif. Elle s’appuie sur le fait que tous les nombres positifs ont leur bit le plus Ă  gauche Ă  0. Cependant, si le nombre fourni est zĂ©ro ou zĂ©ro nĂ©gatif, il doit toujours renvoyer false.

Nombre: 1 = 0b0001
isPositive: true

Nombre: -1 = -0b0001
isPositive: false

Voir isPositive.js pour plus de détails.

Multiplier par deux

Cette mĂ©thode dĂ©cale un nombre donnĂ© d’un bit vers la gauche. Ainsi, toutes les composantes du nombre binaire (en puissances de deux) sont multipliĂ©es par deux et donc le nombre lui-mĂȘme est multipliĂ© par deux.

Avant le décalage
Nombre: 0b0101 = 5
Puissances de deux: 0 + 2^2 + 0 + 2^0

AprÚs le décalage
Nombre: 0b1010 = 10
Puissances de deux: 2^3 + 0 + 2^1 + 0

Voir multiplyByTwo.js pour plus de détails.

Diviser par deux

Cette mĂ©thode dĂ©cale un nombre donnĂ© d’un bit vers la droite. Ainsi, toutes les composantes du nombre binaire (en puissances de deux) sont divisĂ©es par deux et donc le nombre lui-mĂȘme est divisĂ© par deux, sans reste.

Avant le décalage
Nombre: 0b0101 = 5
Puissances de deux: 0 + 2^2 + 0 + 2^0

AprÚs le décalage
Nombre: 0b0010 = 2
Puissances de deux: 0 + 0 + 2^1 + 0

Voir divideByTwo.js pour plus de détails.

Inverser le signe (Switch Sign)

Cette mĂ©thode rend positifs les nombres nĂ©gatifs, et vice-versa. Pour ce faire, elle s’appuie sur l’approche “ComplĂ©ment Ă  deux”, qui inverse tous les bits du nombre et y ajoute 1.

1101 -3
1110 -2
1111 -1
0000  0
0001  1
0010  2
0011  3

Voir switchSign.js pour plus de détails.

Multiplier deux nombres signés

Cette mĂ©thode multiplie deux nombres entiers signĂ©s Ă  l’aide d’opĂ©rateurs bit Ă  bit. Cette mĂ©thode est basĂ©e sur les faits suivants:

a * b peut ĂȘtre Ă©crit sous les formes suivantes:
  0                     si a est zero ou b est zero ou les deux sont zero
  2a * (b/2)            si b est pair
  2a * (b - 1)/2 + a    si b est impair et positif
  2a * (b + 1)/2 - a    si b est impair et negatif

L’avantage de cette approche est qu’à chaque Ă©tape de la rĂ©cursion l’un des opĂ©randes est rĂ©duit Ă  la moitiĂ© de sa valeur d’origine. Par consĂ©quent, la complexitĂ© d’exĂ©cution est O(log(b)) oĂč b est l’opĂ©rande qui se rĂ©duit de moitiĂ© Ă  chaque rĂ©cursion.

Voir multiply.js pour plus de détails.

Multiplier deux nombres positifs

Cette mĂ©thode multiplie deux nombres entiers Ă  l’aide d’opĂ©rateurs bit Ă  bit. Cette mĂ©thode s’appuie sur le fait que “Chaque nombre peut ĂȘtre lu comme une somme de puissances de 2”.

L’idĂ©e principale de la multiplication bit Ă  bit est que chaque nombre peut ĂȘtre divisĂ© en somme des puissances de deux:

Ainsi

19 = 2^4 + 2^1 + 2^0

Donc multiplier x par 19 est equivalent à :

x * 19 = x * 2^4 + x * 2^1 + x * 2^0

Nous devons maintenant nous rappeler que x * 2 ^ 4 équivaut à déplacerx vers la gauche par 4 bits (x << 4).

Voir multiplyUnsigned.js pour plus de détails.

Compter les bits Ă  1

This method counts the number of set bits in a number using bitwise operators. The main idea is that we shift the number right by one bit at a time and check the result of & operation that is 1 if bit is set and 0 otherwise.

Cette mĂ©thode dĂ©compte les bits Ă  1 d’un nombre Ă  l’aide d’opĂ©rateurs bit Ă  bit. L’idĂ©e principale est de dĂ©caler le nombre vers la droite, un bit Ă  la fois, et de vĂ©rifier le rĂ©sultat de l’opĂ©ration & : 1 si le bit est dĂ©fini et 0 dans le cas contraire.

Nombre: 5 = 0b0101
DĂ©compte des bits Ă  1 = 2

Voir countSetBits.js pour plus de détails.

Compter les bits nécessaire pour remplacer un nombre

This methods outputs the number of bits required to convert one number to another. This makes use of property that when numbers are XOR-ed the result will be number of different bits.

Cette méthode retourne le nombre de bits requis pour convertir un nombre en un autre. Elle repose sur la propriété suivante: lorsque les nombres sont évalués via XOR, le résultat est le nombre de bits différents entre les deux.

5 = 0b0101
1 = 0b0001
Nombre de bits pour le remplacement: 1

Voir bitsDiff.js pour plus de détails.

Calculer les bits significatifs d’un nombre

Pour connaĂźtre les bits significatifs d’un nombre, on peut dĂ©caler 1 d’un bit Ă  gauche plusieurs fois d’affilĂ©e jusqu’à ce que ce nombre soit plus grand que le nombre Ă  comparer.

5 = 0b0101
DĂ©compte des bits significatifs: 3
On décale 1 quatre fois pour dépasser 5.

Voir bitLength.js pour plus de détails.

VĂ©rifier si un nombre est une puissance de 2

Cette mĂ©thode vĂ©rifie si un nombre donnĂ© est une puissance de deux. Elle s’appuie sur la propriĂ©tĂ© suivante. Disons que powerNumber est une puissance de deux (c’est-Ă -dire 2, 4, 8, 16 etc.). Si nous faisons l’opĂ©ration & entre powerNumber et powerNumber - 1, elle retournera0 (dans le cas oĂč le nombre est une puissance de deux).

Nombre: 4 = 0b0100
Nombre: 3 = (4 - 1) = 0b0011
4 & 3 = 0b0100 & 0b0011 = 0b0000 <-- Égal Ă  zĂ©ro, car c'est une puissance de 2.

Nombre: 10 = 0b01010
Nombre: 9 = (10 - 1) = 0b01001
10 & 9 = 0b01010 & 0b01001 = 0b01000 <-- Différent de 0, donc n'est pas une puissance de 2.

Voir isPowerOfTwo.js pour plus de détails.

Additionneur complet

Cette mĂ©thode ajoute deux nombres entiers Ă  l’aide d’opĂ©rateurs bit Ă  bit.

Elle implĂ©mente un additionneur simulant un circuit Ă©lectronique logique, pour additionner deux entiers de 32 bits, sous la forme « complĂ©ment Ă  deux ». Elle utilise la logique boolĂ©enne pour couvrir tous les cas possibles d’ajout de deux bits donnĂ©s: avec et sans retenue de l’ajout de l’étape prĂ©cĂ©dente la moins significative.

LĂ©gende:

A = 3: 011
B = 6: 110
┌──────┬────┬────┬─────────┬──────────┬─────────┬───────────┬───────────┐
│  bit │ ai │ bi │ carryIn │ carryOut │  bitSum │ resultBin │ resultDec │
├──────┌────┌────┌─────────┌──────────┌─────────┌───────────┌────────────
│   0  │ 1  │ 0  │    0    │    0     │     1   │       1   │     1     │
│   1  │ 1  │ 1  │    0    │    1     │     0   │      01   │     1     │
│   2  │ 0  │ 1  │    1    │    1     │     0   │     001   │     1     │
│   3  │ 0  │ 0  │    1    │    0     │     1   │    1001   │     9     │
└──────┮────┮────┮─────────┮──────────┮─────────┮───────────┮───────────┘

Voir fullAdder.js pour plus de détails.
Voir Full Adder on YouTube.

Références