2009-06-23 10 views
15

Je n'ai pas mon livre de référence Java et j'ai du mal à trouver une réponse avec Google.Java >> versus >>> Opérateur?

Quelle est la différence entre les opérateurs ">>" et ">>>" en Java?

int value = 0x0100; 

int result = (value >> 8); 
System.out.println("(value >> 8) = " + result); // Prints: "(value >> 8) = 1" 

result = (value >>> 8); 
System.out.println("(value >>> 8) = " + result); // Prints: "(value >>> 8) = 1" 
+1

doubles possibles: [Différence entre >>> >> et] (http://stackoverflow.com/ q/2811319/1529630), [Différence entre les opérateurs >>> et >>] (http: // stackoverflow.com/q/1972356/1529630) – Oriol

Répondre

8

De Java Notes: Bitwise Operators:

n >> p(décalage à droite) décale les bits de positions p n droite. Si n est un nombre signé d'un complément à 2, le bit de signe est décalé dans les positions d'ordre supérieur.

Exemple: 5 >> 2 = 1

n >>> p(décalage à droite) décale les bits de positions p n droite. Les zéros sont décalés dans les positions d'ordre supérieur.

Exemple: -4 >>> 28 = 15

0

certains info

le >> opérateur conserve les bits à gauche. Les bits les plus à gauche sont remplis avec le contenu précédent. C'est à voir avec l'extension de signe. Dans ce cas il y a un 1 à gauche et il est conservé. Si vous ne voulez pas conserver le 1 à gauche, utilisez l'opérateur >>> qui décale les 0 dans les bits les plus à gauche.

2

Le >> est un décalage arithmétique, qui préserve le bit de signe dans tout "vide" morceaux. L'autre est un changement logique qui remplit les endroits vides de zéros.

0

Cela a à voir avec la valeur mathématique signée. Les >>> pilules, des zéros pour les bits de commande de hauteur, les >> conservants le bit de signe et le tire en.

0

Le décalage arithmétique >> est la division par deux pour les nombres entiers signés, tandis que le décalage logique >>> est la division par deux pour les nombres non signés (si vous interprétez le motif de bits dans un int Java signé comme un entier non signé).

23

Les entiers signés utilisent le bit de poids fort pour désigner le signe.

Donc, >> préserve le signe, alors que >>> ne le fait pas. C'est pourquoi >> est appelé arithmétique décalage et >>> est le décalage logique.

De cette façon, vous pouvez faire (en supposant des entiers de 32 bits) ce qui suit:

  • -10 >> 1 rendements -5 (0xFFFFFFF6 >> 1 cède 0xFFFFFFFB - remarquez le bit de poids fort reste le même.)
  • -10 >>> 1 rendements 2147483643 (0xFFFFFFF6 >>> 1 cède 0x7FFFFFFB -.. remarque que tous les bits ont été décalés, de sorte que le bit d'ordre élevé est présent à zéro le nombre est plus négatif selon la arithemetic twos-complément)

Pour les entiers positifs, >> et >>> agissent de la même façon puisque le bit de poids fort est déjà nul.

Il explique également pourquoi il n'y a pas besoin d'opérateur <<<. Puisque le signe serait saccagé en faisant glisser les bits vers la gauche, il ne correspondrait à aucune opération arithmétique raisonnable.

+4

+1 réponse la plus utile –

+0

@BillK Bien que la réponse soit bonne, mais n'avez-vous pas vu que lorsque vous allez commenter, SO vous demande de ne pas écrire des choses comme ** + 1 * * ou ** merci **? – Hackerdarshi

+0

@PriydarshiSingh Je n'aurais pas normalement mais j'ai pensé qu'il était utile de souligner que cela devrait être voté au-dessus de la réponse acceptée (semble avoir fonctionné). Aurait-il été préférable que je dise simplement "La réponse la plus utile"? Aussi, êtes-vous absolument certain que cette ligne directrice existait en 2009? –

4

La bonne réponse a été postée plus d'une fois, mais pas auprès d'une source autorisée.

C'est des JLS§15.19 Shift Operators:

Les opérateurs de décalage comprennent Maj gauche <<, droite signé déplacer >> et décalage droit non signé >>>; ils sont syntactiquement à gauche associative (ils sont groupés de gauche à droite). L'opérande gauche d'un opérateur de décalage est la valeur à déplacer; l'opérande de droite indique la distance de décalage.

...

La valeur de n>>s est ns positions de bits de droite décalée par extension de signe. La valeur résultante est & lfloor; n/2 s & rfloor ;. Pour les valeurs non négatives de n, cela équivaut à tronquer la division entière, calculée par l'opérateur de division entier /, par deux à la puissance s.

La valeur de n>>>s est n décalée vers la droite s positions de bit avec extension nulle. Si n est positif, le résultat est le même que celui de n>>s; si n est négatif, le résultat est égal à celui de l'expression (n>>s)+(2<<~s) si le type de l'opérande de gauche est int, et au résultat de l'expression (n>>s)+(2L<<~s) si le type de l'opérande de gauche est long. Le terme ajouté (2<<~s) ou (2L<<~s) annule le bit de signe propagé. (Notez que, en raison du masquage implicite de l'opérande droit d'un opérateur de décalage, ~s comme une distance de changement de vitesse est équivalente à 31-s lors du passage d'une valeur int et à 63-s lors du passage d'une valeur long.)

+0

Merci beaucoup pour cette réponse. Il répond à une question différente que j'avais: Comment effectuer efficacement un changement arithmétique sur un processeur qui a seulement des changements logiques. "(n >> s) + (2 << ~ s)" semble une bonne réponse à cela :-) – Mecki

4

Pour les nombres positifs, il n'y a pas de différence. Les nombres négatifs (complément à deux) seront remplis de zéros pour >>> et de chiffres pour >>.

1010 0110 >>> 2 = 0010 1001

1010 0110 >> 2 = 1110 1001