465 votes

Différence entre >>> et >>

Quelle est la différence entre >>> y >> en Java ?

2 votes

510voto

danben Points 35312

>> est un décalage arithmétique vers la droite, >>> est un décalage logique vers la droite.

Dans un décalage arithmétique, le bit de signe est étendu pour préserver le caractère signé du nombre.

Par exemple : -2 représenté en 8 bits serait 11111110 (parce que le bit le plus significatif a un poids négatif). Le décaler d'un bit vers la droite en utilisant le décalage arithmétique vous donnerait 11111111 ou -1. Le décalage logique vers la droite, cependant, ne se soucie pas du fait que la valeur puisse éventuellement représenter un nombre signé ; il déplace simplement tout vers la droite et remplit la partie gauche avec des 0. Le décalage d'un bit vers la droite de notre -2 en utilisant le décalage logique donnerait 01111111 .

13 votes

Bien que je sois d'accord et que j'apprécie que les changements arithmétiques peut être utilisé pour multiplier des nombres signés par 2^k Je trouve bizarre que ce soit la réponse de tout le monde. Une chaîne de bits n'est pas un nombre, et >> peut toujours être utilisé sur n'importe quelle chaîne de bits : il fait toujours la même chose, quel que soit le rôle joué par cette chaîne de bits et qu'elle ait ou non le concept de "signe". Serait-il possible d'ajouter à votre réponse déjà excellente une discussion sur le cas où votre opérande est no est interprété comme un nombre signé ? Ma plainte a-t-elle un sens ?

14 votes

Pourquoi dites-vous qu'une suite de bits n'est pas un nombre ? Diriez-vous qu'une suite de chiffres décimaux n'est pas un nombre ?

6 votes

@danben Discuter du fait qu'il s'agisse ou non d'un nombre n'a de sens que si on le relie à un contexte. Si l'internet n'est que de l'électricité, alors je suis d'accord pour dire qu'une chaîne de caractères n'est qu'un nombre.

119voto

polygenelubricants Points 136838

>>> est un décalage non signé ; il insérera 0. >> est signé, et prolongera le bit de signe.

JLS 15.19 Opérateurs de quart

Les opérateurs de décalage comprennent le décalage à gauche << , signé décalage à droite >> et le décalage à droite non signé >>> .

La valeur de n>>s es n décalé vers la droite s positions binaires avec extension de signe .

La valeur de n>>>s es n décalé vers la droite s positions binaires avec extension zéro .

    System.out.println(Integer.toBinaryString(-1));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >> 16));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >>> 16));
    // prints "1111111111111111"

Pour rendre les choses plus claires, il faut ajouter la contrepartie positive

System.out.println(Integer.toBinaryString(121));
// prints "1111001"
System.out.println(Integer.toBinaryString(121 >> 1));
// prints "111100"
System.out.println(Integer.toBinaryString(121 >>> 1));
// prints "111100"

Comme il est positif, les décalages signés et non signés ajouteront 0 au bit le plus à gauche.

Questions connexes

0 votes

Sans vos exemples, je ne comprendrais pas.

55voto

corsiKa Points 39442

>>> mettra toujours un 0 dans le bit le plus à gauche, alors que >> mettra un 1 ou un 0 en fonction de son signe.

54voto

Matt Points 21690

Ils sont tous deux à droite, mais >>> es unsigned

De la documentation :

L'opérateur de décalage à droite non signé ">>>" décale un zéro dans la position la plus à gauche, tandis que la position la plus à gauche après ">>" dépend de l'extension du signe.

14 votes

Pouvez-vous expliquer avec un exemple

1 votes

Je pense aussi que vous devriez donner un exemple.

0 votes

Je suppose que >>> est non signée, mais pourquoi 7>>32=7 ? J'ai lancé une boucle qui faisait un changement à la fois et j'ai vu qu'après 32 les déplacements, il est revenu à 7 . La seule façon dont cela peut avoir un sens est que pour chaque nombre décalé, il entre dans un "cercle extérieur". Après 32 des quarts de travail, il est revenu d'une manière ou d'une autre à sa position, mais évidemment cela n'a toujours pas de sens. Que se passe-t-il ?

15voto

Braj Points 28874

Plus d'informations sur Opérateurs de type bit à bit et de décalage de bit

>>      Signed right shift
>>>     Unsigned right shift

La configuration binaire est donnée par l'opérande de gauche, et le nombre de positions à décaler par l'opérande de droite. L'opérateur de décalage droit non signé >>> déplace un zéro dans la position la plus à gauche ,

tandis que la position la plus à gauche après >> dépend de l'extension du signe.

En termes simples >>> toujours déplace un zéro dans la position la plus à gauche alors que >> se déplace en fonction du signe du nombre, c'est-à-dire 1 pour un nombre négatif et 0 pour un nombre positif.


Par exemple, essayez avec des nombres négatifs et positifs.

int c = -153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.println(Integer.toBinaryString(c <<= 2));

System.out.println();

c = 153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));

sortie :

11111111111111111111111111011001
11111111111111111111111101100100
  111111111111111111111111011001
11111111111111111111111101100100

                          100110
                        10011000
                          100110
                        10011000

0 votes

Merci. Je veux juste ajouter un commentaire pour référencer la représentation binaire de Integer.MAX_VALUE, Integer.MIN_VALUE, -1, 0, 1 . eg : System.out.println(Integer.MAX_VALUE + ": " + String.format("%32s", Integer.toBinaryString(Integer.MAX_VALUE)).replace(' ', '0')) ; Entier.MAX_VALUE : 01111111111111111111111111111111; Entier.MIN_VALUE : 10000000000000000000000000000000; -1 : 11111111111111111111111111111111; 0 : 00000000000000000000000000000000; 1 : 00000000000000000000000000000001

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X