Quel est le but de la unsigned décalage à droite de l'opérateur “>>>” en Java?
Je comprends ce que la unsigned décalage à droite de l'opérateur ">>>" en Java, mais pourquoi avons-nous besoin, et pourquoi n'avons-nous pas besoin d'un correspondant non signé décalage à gauche de l'opérateur?
- Double Possible de la Différence entre >>> et >>
Vous devez vous connecter pour publier un commentaire.
La
>>>
opérateur permet de traiterint
etlong
32 - et 64-bits unsigned les types intégraux, qui sont manquants dans le langage Java.Ceci est utile lorsque vous changez quelque chose qui ne représente pas une valeur numérique. Par exemple, vous pourrait représenter un noir et blanc peu l'image de la carte en utilisant 32 bits
int
s, où chaqueint
code 32 pixels sur l'écran. Si vous avez besoin de faire défiler l'image vers la droite, vous préférez les bits sur la gauche d'uneint
à devenir des zéros, de sorte que vous pouvez facilement mettre les bits de la proximitéint
s:Le code ci-dessus ne fait pas attention au contenu de la partie supérieure de trois bits, parce que
>>>
opérateur rendIl n'y a pas de
<<
opérateur parce décalage vers la gauche des opérations sur les entiers signés et non signés types de données sont identiques.>>>
(par exemple, lorsque vous utilisez>>
) le bit le plus significatif (AKA "le bit de signe") d'une version 32 bits ou 64 bits de la valeur obtient le traitement spécial - il répliqué dans le nouveau bit de signe après la maj, donc le signe de la valeur après la>>
maj reste le même. C'est différent pour les types non signés dans les langues qui ont leur (dire, C/C++ ou C#). Dans ces langues, le contenu du bit de signe est contrôlé par le type de la première opérande. Depuis il n'y a pas non signé types en Java, le langage fini par l'introduction d'un opérateur spécial pour unsigned "droit shifting".>>>
est également la sûre et efficace de la façon de trouver l'arrondi moyenne de deux (grandes) entiers:Si les entiers
high
etlow
sont à proximité du plus grand entier machine, le ci-dessus sont correctes maispouvez obtenir un mauvais résultat à cause de débordement.
Voici un exemple d'utilisation, la correction d'un bug dans le naïf binaire de recherche.
En gros, cela a à voir avec le signe (numberic quarts de travail) ou unsigned quarts de travail (normalement pixel choses liées).
Depuis la maj gauche, ne pas traiter avec le bit de signe, de toute façon, c'est la même chose (<<< et <<)...
De toute façon, je n'ai pas encore rencontré quelqu'un qui a besoin d'utiliser la >>>, mais je suis sûr qu'ils sont là à faire des choses étonnantes.
Pour en savoir plus:
http://henkelmann.eu/2011/02/01/java_the_unsigned_right_shift_operator
http://www.java-samples.com/showtutorial.php?tutorialid=60
<<<
opérateur en Java.<<<
et<<
)"Signé le décalage vers la droite de l'opérateur est utile si on a un
int
qui représente un nombre et que l'on souhaite diviser par une puissance de deux, arrondi vers l'infini négatif. Cela peut être agréable quand vous faites des choses comme la mise à l'échelle des coordonnées pour l'affichage; non seulement est-il plus rapide que la division, mais des coordonnées qui diffèrent par le facteur d'échelle avant mise à l'échelle diffèrent d'un pixel par la suite. Si au lieu d'utiliser déplacement on utilise la division, cela ne marchera pas. Lors de la mise à l'échelle par un facteur de deux, par exemple, -1 et +1 diffèrent par deux, et devrait diffèrent donc par un après, mais -1/2=0 et 1/2=0. Si au lieu de cela on utilise signé décalage vers la droite, les choses fonctionnent bien: -1>>1=-1 et 1>>1=0, correctement fourniture de valeurs d'un pixel à part.Unsigned opérateur est utile dans les cas où l'entrée est prévu pour avoir exactement un ensemble de bits que l'on vous en voulez faire de même, ou dans les cas où l'on sera à l'aide d'une boucle pour la production de tous les bits dans un mot et veut terminer proprement. Par exemple:
Si le code à utiliser signé un décalage vers la droite de l'opération et ont été transmis à une valeur négative, elle serait sortie de 1 indéfiniment. Avec la unsigned-décalage vers la droite de l'opérateur, cependant, le bit le plus significatif finit par être interprété comme toutes les autres.
Unsigned décalage vers la droite de l'opérateur peut également être utile lors d'un calcul, arithmétique, le rendement d'un nombre positif compris entre 0 et 4,294,967,295 et que l'on souhaite diviser ce nombre par une puissance de deux. Par exemple, lors du calcul de la somme de deux
int
valeurs qui sont connus pour être positif, on peut utiliser(n1+n2)>>>1
sans avoir à promouvoir les opérandes delong
. Aussi, si l'on souhaite diviser un positifint
valeur par quelque chose comme pi sans l'aide de mathématiques à virgule flottante, on peut calculer((value*5468522205L) >>> 34)
[(1L<<34)/pi est 5468522204.61, qui arrondi les rendements 5468522205]. Pour les dividendes sur 1686629712, le calcul devalue*5468522205L
donnerait un "négatif" de la valeur, mais depuis le arithmétiquement-valeur correcte est connu pour être positif, à l'aide de la unsigned décalage vers la droite permettrait le bon nombre positif à être utilisé.Normale décalage à droite
>>
d'un nombre négatif gardera négatif. I. e. le bit de signe sera retenu.Un unsigned décalage à droite
>>>
déplacera le bit de signe trop, pour le remplacer par un bit zéro.Il n'est pas nécessaire d'avoir l'équivalent de décalage vers la gauche, car il y a un seul bit de signe et il est le plus à gauche des bits de sorte qu'il n'interfère lors du passage de droite.
Essentiellement, la différence est que l'on conserve le bit de signe, les autres changements de zéros à remplacer le bit de signe.
Pour les nombres positifs, ils agissent de la même manière.
Pour un exemple d'utilisation de deux
>>
et>>>
voir BigInteger shiftRight.BigInteger
par exemple, il utilise un tableau d'entiers pour stocker son numéro. À décalage à droite elle serait d'utiliser>>>
à décalage à droite tous les, mais le plus grand nombre.Dans le Java domaine la plupart des applications typiques de la voie pour éviter les débordements est d'utiliser le moulage ou le Grand Entier, tel que int longtemps dans les exemples précédents.