Différence entre> et>

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

286
demandé sur kay 2010-05-11 18:02:19
la source

7 ответов

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

dans un décalage arithmétique, le signe bit est étendu pour préserver la signification du nombre.

par exemple: -2 représenté en 8 bits serait 11111110 (parce que le bit le plus significatif a un poids négatif). Changer un peu de la droite en utilisant le décalage arithmétique vous donnerait 11111111 , ou -1. Le déplacement logique à droite, cependant, ne se soucie pas que le la valeur peut éventuellement représenter un nombre signé; elle déplace simplement tout à droite et remplit à partir de la gauche avec 0s. Changer notre -2 un peu à droite en utilisant le décalage logique donnerait 01111111 .

321
répondu danben 2017-12-15 23:31:13
la source

>>> est non signé-shift; il insérera 0. >> est signé, et va étendre le bit de signal.

JLS 15.19 opérateurs de postes

les opérateurs de quart comprennent le quart de gauche << , le quart de droite signé >> et le quart de droite non signé >>> .

la valeur de n>>s est n bit positions "à déplacement droit s avec signal-extension .

la valeur de n>>>s est n positions de bits décalées vers la droite s 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 ajout de 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"

Puisqu'il est positif, les changements signés et non signés ajouteront 0 à gauche la plupart du temps.

Related questions

76
répondu polygenelubricants 2017-05-23 14:54:59
la source

ils sont tous les deux de droite, mais >>> est unsigned

De la documentation :

l'opérateur de poste de droite 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 signal.

41
répondu Matt 2010-05-11 18:03:11
la source

>>> mettra toujours un 0 dans le morceau le plus à gauche, tandis que >> mettra un 1 ou un 0 selon ce que le signe de celui-ci est.

34
répondu corsiKa 2010-05-11 18:04:11
la source

le déplacement logique vers la droite ( v >>> n ) renvoie une valeur dans laquelle les bits de v ont été déplacés vers la droite par des positions de bits de n , et les 0 sont déplacés du côté gauche. Envisager de changer les valeurs 8 bits, écrit en binaire:

01111111 >>> 2 = 00011111
10000000 >>> 2 = 00100000

si nous interprétons les bits comme un entier non-négatif non-signé, le décalage logique de droite a pour effet de diviser le nombre par la puissance correspondante de 2. Cependant, si le numéro est dans l' deux's-la représentation de complément, le déplacement logique de droite ne divise pas correctement les nombres négatifs. Par exemple, le deuxième décalage à droite au-dessus des décalages 128 à 32 lorsque les bits sont interprétés comme des nombres non signés. Mais il passe de -128 à 32 lorsque, comme c'est typique en Java, les bits sont interprétés dans le complément de two.

donc, si vous changez pour diviser par une puissance de deux, vous voulez le décalage arithmétique droit ( v >> n ). Il renvoie une valeur dans laquelle les bits v ont été déplacés vers la droite par n positions de bits, et des copies de le bit le plus à gauche de v sont déplacés du côté gauche:

01111111 >> 2 = 00011111
10000000 >> 2 = 11100000

quand les bits sont un nombre dans la représentation du complément de two, le décalage arithmétique à droite a l'effet de se diviser par une puissance de deux. Cela fonctionne parce que le bit le plus à gauche est le bit de signe. Diviser par un pouvoir de deux doit garder le même signe.

32
répondu andru 2017-01-20 16:11:21
la source

plus d'informations à propos de Bitwise and Bit Shift Operators

>>      Signed right shift
>>>     Unsigned right shift

le patron de bits est donné par l'opérande de gauche, et le nombre de positions à décaler par l'opérande de droite. L'opérateur de poste de droite non signé >>> déplace un zéro dans la position la plus à gauche ,

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

en termes simples >>> toujours déplace un zéro vers la position la plus à gauche tandis que >> se déplace sur la base du signe du nombre i.e. 1 pour le nombre négatif et 0 pour le nombre positif.


par exemple essayer avec des nombres négatifs aussi bien que 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
8
répondu Braj 2014-07-30 20:08:39
la source

l'opérateur logique du décalage de droite ( >>> N ) déplace les bits vers la droite par N, en écartant le bit de signalisation et en remplaçant N par 0 pour la plupart des bits à gauche. Par exemple:

-1 (in 32-bit): 11111111111111111111111111111111

après une >>> 1 l'opération devient:

2147483647: 01111111111111111111111111111111

l'opérateur d'arithmétique de poste de droite ( >> N ) déplace également les bits vers la droite par N, mais conserve le bit de signe et tamponne le N le plus à gauche avec les bits 1. Par exemple::

-2 (in 32-bit): 11111111111111111111111111111110

après >> 1 l'opération devient:

-1: 11111111111111111111111111111111
4
répondu bigT 2015-01-27 12:19:04
la source

Autres questions sur java syntax operators