Décalage binary x * un nombre

Comment obtenez-vous un nombre comme -10 partir de ces problèmes de pratique changeants?

D’après ce que je comprends, X*32 peut être écrit comme x<<5 . Mais comment pouvez-vous obtenir des nombres comme x*66 ou X*(-10) ?

Explication générale

Le décalage des bits vise principalement à modifier la représentation binary d’un nombre. Ce n’est pas pour la multiplication.

 23 = 0001 0111 23 << 1 = 0001 0111 << 1 = 0010 1110 = 46 

Cependant, la représentation binary d'un nombre étant modifiée, le nombre qu'il représente l'est également. C'est juste comment fonctionne le système binary de l'ordinateur. Et ainsi, les gens exploitent parfois ce comportement comme un "bidouillage", principalement pour accélérer le temps de calcul.

Essayons de le comprendre plus:


Décalage gauche et décalage droit

Désormais, lorsque le nombre représenté est de type integer , alors décaler la représentation binary d'un nombre de 1 à gauche équivaudra à le multiplier par 2:

 23 = 0001 0111 23 << 1 = 0001 0111 << 1 = 0010 1110 = 46 //left bit-shift by 1, number becomes doubled 

Étant donné qu'il n'y a pas de dépassement de capacité pour le type de données donné:

 255 = 1111 1111 //assuming 8-bit data type 255 << 1 = 1111 1111 << 1 = 1111 1110 = 254 //not multiplied by 2, because of overflow 

Tout en décalant le nombre entier vers la droite équivaudra à le diviser par 2 puis à l’ arrondir vers le bas :

 23 = 0001 0111 23 >> 1 = 0001 0111 >> 1 = 000 1011 = 11 //right bit-shift by 1, number becomes halved, rounded down 

Certains utilisent et lient à la multiplication et à la division

Etant donné que l'opération de transfert de bits est généralement moins coûteuse que la multiplication, vous constaterez, dans certains programmes, que les utilisateurs utilisent l'opération de décalage à gauche (en remplacement de la multiplication) lorsqu'ils veulent la multiplier par an integer number of power of 2 (c'est-à-dire 2, 4, 8, 16, etc.):

 int a = 23; ... a = a << 2; //=102; multiply by 4, equivalent to a = a * 4, but faster operation 

Ou utilisez l'opération de décalage de bits de droite (en remplacement de la division et de l'arrondi) pour la diviser avec an integer number of power of 2 (c'est-à-dire 2, 4, 8, 16, etc.)

 int a = 23; ... a = a >> 2; //=5; divide by 4 and rounding down, equivalent to integer division a = a / 4, but faster 

Remarques finales

Notez que ce n'est que si vous travaillez avec un nombre avec une puissance de 2 que toutes les multiplications et divisions ci-dessus peuvent être remplacées par un décalage gauche ou un décalage droit.

Dans votre exemple, 66 et -10 ne sont pas un nombre entier dont la puissance est de 2; vous ne pouvez donc pas "pirater" la multiplication / division avec une opération de décalage binary.

En général, utilisez l'opération de décalage de bit si vous voulez parler de décalage de bit, car ce dernier a de nombreuses autres utilisations que le simple "hacking" pour la multiplication / division avec un nombre entier de puissance égal à 2. Si vous voulez multiplier ou diviser, soyez content de simplement utiliser les opérateurs multiplication ( * ) ou division ( / ).


Quelques remarques supplémentaires:

Ceci étant dit, je voudrais juste append quelques éléments supplémentaires concernant le transfert de bits pour plus d'explications (cela ne fera pas de mal):

  • le type integer signé peut contenir un nombre positif ou négatif
  • il existe une différence entre le décalage de bits logique et le décalage de bits arithmétique lorsqu'il s'agit d'un nombre négatif. L’un donnera 0 dans l’espace vide après chaque poste, tandis que l’autre donnera 1
  • Par conséquent, il est probablement préférable de noter que le décalage de bits est principalement utilisé pour le type unsigned , comme pour créer des masques de bits par décalage de bits. C'est-à-dire qu'il est recommandé d'utiliser unsigned pour éviter les sursockets d'extension de signe lorsque vous traitez avec un décalage de bit de nombre négatif (à droite).