Maison > Questions et réponses > le corps du texte
关于java中的移位,例如
int a=-8;
System.out.println(a>>>33);//2147483644
System.out.println(a>>>1); //2147483644
这里我采用了逻辑右移(无符号右移)为例,对-8进行逻辑右移,移动33位和移动1位的效果是一样的,其原因是移动33位时对其进行取模操作(与32相除的余数),对其余数进行移位,请问Java中这样设计的理由是什么?为什么不是当逻辑右移超过32位时,其结果应该为0,这样不是更符合常理吗?
巴扎黑2017-04-17 17:42:08
J'ai vu quelqu'un remettre en question ma réponse, alors je l'ai modifiée
Ce que disait l'affiche originale, c'est pourquoi le décalage 33 n'est pas réglé directement sur 0 ?
Parce que si vous opérez de cette façon, tout d'abord, il y aura beaucoup de nombres magiques dans le code simple ~ Parce que si je décale de 33, ça peut aussi être 0, et si je décale de 34, ça peut être également 0....
De cette façon, il n'y a plus de norme, et l'opération de décalage doit être effectuée étape par étape (enregistrer la valeur, puis calculer, et ainsi de suite). Ce type de mouvement illimité doit être). inacceptable pour les ordinateurs et les concepteurs de langages ! ! ! !
*L'opération de décalage est simplement la multiplication par 2 et la division par 2 sous-jacentes. Tout d'abord, je veux dire le point de vue ! Aucun nombre non nul divisé par 2^n n'obtiendra 0. Les personnes qui connaissent un peu les mathématiques devraient facilement être capables de comprendre pourquoi 1 >> 1 obtiendra 0< Le résultat de 🎜> ? ? ? Étant donné que les opérations sur bits ne fonctionnent que sur des nombres entiers, il s'agit du même concept que d'utiliser directement 1/2 comme 0 au lieu de 0,5.
大家讲道理2017-04-17 17:42:08
L'opération de décalage
est souvent utilisée pour optimiser la méthode */
en raison de sa grande efficacité. Décaler une position vers la gauche équivaut à *2
, et déplacer une position vers la droite équivaut à /2
. Bien entendu, cela se fait dans un certain nombre de conditions.
Quant au >>>
décalage 33 bits de 不合理
, c'est une option pour effectuer le décalage après l'opération modulo, non ? Il devrait y avoir d'autres utilisations, comme l'exécution de certains algorithmes spéciaux (tels que l'algorithme de chiffrement MD5
).
Quant à ce que le premier étage a expliqué, je ne peux pas être d'accord avec cela. Le décalage, la multiplication et la division sont équivalents et nécessitent des conditions de plage. En tant que programmeur, vous devez y prêter attention lorsque vous l'utilisez. Personnellement, je pense que l'opération Java Shift présente déjà certaines caractéristiques du C. Il s'agit d'une opération de bas niveau qui nécessite que les programmeurs possèdent certaines compétences de base pour bien l'utiliser.
PHP中文网2017-04-17 17:42:08
Vous avez dépassé la longueur maximale du type une fois pour obtenir 0, pourquoi ne pas simplement le définir sur 0 ?