web-dev-qa-db-fra.com

Que sont (x & 1) et (x >> = 1)?

J'essaie de faire une affectation: "Trouver le nombre de bits dans un type de données entier non signé sans utiliser la fonction sizeof ()."

Et ma conception consiste à convertir l'entier en bits, puis à les compter. Par exemple: 10 is 1010 et 5 is 101

Conversion d'un entier en représentation binaire affiche quelque chose comme ceci:

do
{ 
    Vec.Push_back( x & 1 ) 
} 
while ( x >>= 1 );

Je ne veux pas simplement copier des trucs en pâte. Quand j'utilise le F-10, je vois ce que (x & 1) est en train de faire mais je ne sais pas si c'est son nom ou comment il fait son travail (comparer quelque chose?). Je sais aussi >= qui "supérieur ou égal" mais qu'est-ce que x >>= 1?

Remarque: la copie marquée est un code JavaScript et non C++.

36
Sandra K

Ce sont Opérateurs sur les bits ( référence ).

x & 1 produit une valeur qui est soit 1 ou 0, en fonction du bit le moins significatif de x: si le dernier bit est 1, Le résultat de x & 1 est 1; sinon, c'est 0. Ceci est une opération AND au niveau des bits.

x >>= 1 signifie "régler x sur lui-même décalé d’un bit vers la droite". L'expression est évaluée à la nouvelle valeur de x après le décalage.

Remarque: La valeur du bit de poids fort après le décalage est zéro pour les valeurs de type non signé. Pour les valeurs de type signé, le bit le plus significatif est copié du bit de signe de la valeur avant le décalage dans le cadre de extension de signe, la boucle ne se terminera donc jamais si x est un type signé et la valeur initiale est négative.

34
dasblinkenlight

x & 1 est équivalent à x % 2.

x >> 1 est équivalent à x / 2

Donc, ces choses sont essentiellement le résultat et le reste de la division par deux.

18
rama

En plus de la réponse de "dasblinkenlight", je pense qu'un exemple pourrait aider. Je n'utiliserai que 8 bits pour une meilleure compréhension.

x & 1 Produit une valeur soit 1 Ou 0, En fonction du bit le moins significatif de x: si le dernier bit est 1, le résultat de x & 1 est 1; sinon, c'est 0. Ceci est une opération AND au niveau des bits.

En effet, 1 Sera représenté en bits sous la forme 00000001. Seul le dernier bit est défini sur 1. Supposons que x soit 185, Qui sera représenté sous forme de bits sous la forme 10111001. Si vous appliquez une opération AND au niveau des bits sur x avec 1, Vous obtiendrez le résultat suivant:

00000001
10111001
--------
00000001

Les sept premiers bits du résultat de l'opération seront 0 Après l'opération et ne porteront aucune information dans ce cas (voir Opération AND logique ). Parce que quels que soient les sept premiers bits de l'opérande x avant, ils seront après l'opération 0. Mais le dernier bit de l'opérande 1 Est 1 Et il indiquera si le dernier bit de l'opérande x était 0 Ou 1 . Ainsi, dans cet exemple, le résultat de l'opération AND au niveau du bit sera 1 Car notre dernier bit de x est 1. Si le dernier bit aurait été 0, Le résultat aurait été également 0, Indiquant que le dernier bit de l'opérande x est 0:

00000001
10111000
--------
00000000

x >>= 1 Signifie "régler x sur lui-même décalé d'un bit vers la droite". L'expression est évaluée à la nouvelle valeur de x après le décalage

Prenons l'exemple ci-dessus. Pour x >>= 1, Cela serait:

10111001
--------
01011100

Et pour le décalage gauche x <<= 1, Ce serait:

10111001
--------
01110010

Faites attention à la note de l'utilisateur "dasblinkenlight" en ce qui concerne les quarts de travail.

11
stackomatiker

C'est semblable à x = (x >> 1).

(operand1)(operator)=(operand2)  implies(=>)  (operand1)=(operand1)(operator)(operand2) 

Il décale la valeur binaire de x de un à droite.

Par exemple.

int x=3;    // binary form (011) 
x = x >> 1; // zero shifted in from the left, 1 shifted out to the right:
            // x=1, binary form (001)
3
Satyendra Yadav

x & 1 produit une valeur égale à 1 ou à 0, en fonction du bit le moins significatif de x: si le dernier bit est 1, le résultat de x & 1 est 1; sinon, il s'agit de 0. Il s'agit d'une opération AND au niveau des bits.

x >> = 1 signifie "régler x sur lui-même décalé d'un bit vers la droite". L'expression est évaluée à la nouvelle valeur de x après le décalage.

Remarque: La valeur du bit de poids fort après le décalage est zéro pour les valeurs de type non signé. Pour les valeurs du type signé, le bit de poids fort est copié à partir du bit de signe de la valeur avant son décalage dans le cadre de l'extension de signe, de sorte que la boucle ne se termine jamais si x est un type signé et que la valeur initiale est négative.

1
SACHIN DUHAN