2010-02-11 5 views
16

Je m'entraîne pour l'examen SCJP en utilisant des notes de cram d'Internet. Selon mes notes, l'opérateur >> est supposé être signé à droite, avec le bit de signe venant de la gauche. Alors que l'opérateur de décalage gauche << est supposé conserver le bit de signe.Opérateurs de décalage bit à bit. Signé et non signé

Jouer autour cependant, je suis en mesure de changer le signe avec l'opérateur << (fe Integer.MAX_VALUE << 1 évalue à -2, alors que je ne suis jamais en mesure de changer le signe avec l'opérateur >>.

Je dois être malentendu ? quelque chose, mais ce

+0

Voyez ce que '-2 << 31' vous donne. –

+0

Oui, je vois ce que tu veux dire! –

Répondre

39

« >> » est signé parce qu'il garde le signe il utilise le chiffre le plus à gauche dans la représentation binaire d'un nombre comme une charge, par exemple:..

| this value is used as a filler 
    11011011 
>> 11101101 

    01010010 
>> 00101001 

">>>" est une version non signée de cet opérateur. Il utilise toujours zéro comme remplissage:

11011011 
>>> 01101101 

    01010010 
>>> 00101001 

En représentation binaire, le chiffre le plus à gauche détermine le signe du nombre. Donc, si c'est '1', alors nous avons une valeur négative et si c'est '0' - alors notre nombre est positif. C'est pourquoi l'utilisation du digit le plus à gauche comme remplissage permet de garder le signe permanent.

+0

Ah, d'accord, je comprends comment les bons opérateurs de travail sont supposés travailler. Merci! Mais pourquoi suis-je capable de changer de signe avec "<<"? –

+0

Parce qu'il se déplace dans une autre direction et le chiffre le plus à gauche dépend du nombre d'origine. Il utilise 0 comme un remplissage, mais l'ajoute à la droite de votre numéro. – Roman

+0

Le signe d'un nombre entier est déterminé par la valeur de son bit le plus à gauche. Si vous changez de '0' quand c'est' 1' ou vice versa, le signe du résultat change. –

2

L'idée derrière les décalages est qu'ils peuvent agir comme multipliant et divisant par des puissances de 2 (< < 1 est équivalent à * = 2, >> 2 est équivalent à/= 4), ce qui explique pourquoi la version signée de déplacement existe. Les changements non signés ne conservent pas nécessairement les négatifs. L'opérateur < < ne conserve pas le signe, comme vous le suggérez; cela arrive simplement dans votre exemple. Essayez de faire un quart gauche sur 2 147 483 647; ça ne reste pas positif. La raison pour laquelle ils ne s'embarrassent pas d'essayer de faire un shift gauche 'signé' est parce que, si le nombre passe de positif à négatif (ou viceversa), alors vous êtes sorti des limites du type variable de toute façon.

Questions connexes