>" en C #? - Retrouvez les réponses et les commentaires concernant cette question" />
7
votes

Que fait l'opérateur ">>" en C #?

J'ai rencontré cette affirmation dans une pièce de code: xxx

colorlist est une liste de classe system.drawing.color .

La déclaration est supposée récupérer l'indice médian de la liste .. comme le demi-point de celui-ci .. Mais je ne peux pas comprendre comment ce >> symbole fonctionne et comment le "1" est censé donner l'indice médian. J'apprécierais de l'aide: S


0 commentaires

5 Réponses :


12
votes

Le >> opérateur effectue un Bit Shift . < p> L'expression >>> 1 est presque * la même que / 2 de sorte que le programmateur calculait l'index colorlist.count / 2 qui est ** Le Médian . Pour comprendre pourquoi c'est le cas, vous devez examiner la représentation binaire des chiffres concernés. Par exemple, si vous avez 25 éléments de votre liste: xxx

en général utilisant un opérateur bitwise lorsque vous voulez vraiment effectuer une division est une mauvaise pratique. C'est probablement une optimisation prématurée faite parce que le programmeur pensait qu'il serait plus rapide d'effectuer une opération bitwise au lieu d'une division. Il serait beaucoup plus clair d'écrire une division et je ne serais pas surpris si la performance des deux approches est comparable.

* L'expression x >> 1 donne la même chose Résultat comme x / 2 pour tous les entiers positifs et tous les entiers négatifs même. Cependant, cela donne un résultat différent pour les entiers impairs négatifs. Par exemple, -101 >> 1 == -51 tandis que -101 / 2 == -50 .

** En réalité, la médiane est définie que de cette façon si la liste a un nombre impair d'éléments. Pour un nombre pair d'éléments, cette méthode ne parlera pas strictement de ne pas donner la médiane.


3 commentaires

merci beaucoup pour l'explication .. Je connais bien la méthode changeante et c'est une signification, mais je n'ai pas eu que c'est la façon dont il est utilisé ici .. J'ai une autre question si ... Est-ce que cette façon de diviser sur 2 a moins de temps complexité que la division «/» normale?


@Majd: Cela dépend de la plate-forme où vous exécutez le code. N'oubliez pas que c # est compilé en CIL, qui est à son tour traduit ("dissipé") dans un code de machine natif qui diffère de la plate-forme à la plate-forme. Il peut être possible que certains jitters traduisent automatiquement x / 2 dans une instruction de passage à droite.


Dans la première note de bas de page, c'est un peu confus que vous comparez x >> 1 avec x / = 2 , et je pense que le signe = est une faute de frappe. Bien sûr x >> 1 est comparable à x / 2 et x >> = 1 est comparable à x / = 2 .



0
votes

Ce n'est pas un code très lisible, il divise essentiellement le nombre par 2.

>> est l'opérateur à droite, déplacer tous les bits une position à droite.

0110 (6) devient 0011 (3)


0 commentaires

1
votes

>> est l'opérateur de décalage droit du bit et changeant colorlist.count à droite par 1 est plus ou moins équivalent à colorlist.count / 2 .

Un changement de droite de a >> B peut être défini comme A / 2 ^ B .

Quant à la raison pour laquelle vous utiliseriez un changement de droite plutôt que de diviser par 2, je n'ai aucune idée.


1 commentaires

Ne l'utilisez pas au lieu de diviser par 2. Le JIT optimise ce genre de choses.



2
votes

C'est un opportunité bitwise une définition que je viens d'attraper de http://en.wikibooks.org / wiki / c_sharp_programmation / opérateurs :

L'opérateur binaire >> Évalue ses opérandes et renvoie le premier argument obtenu à droite par le nombre de bits spécifiés par le deuxième argument. Il élimine les bits à faible ordre décalé au-delà de la taille de son premier argument et définit de nouveaux bits à haut ordre sur le bit de signalisation du premier argument ou à zéro si le premier argument est non signé.

C'est fondamentalement divisant par 2 ...


1 commentaires

+1 pour la liaison à la documentation. Je trouve si drôle que l'OP a même pris la peine de poster ici au lieu de vous diriger vers les définitions de languosité. Demander une question comme ça est quelque chose qui me fait parler à mes employés de leur attitude (pas: je ne comprends pas ce que la grossed est "mais" hé, je suis trop paresseux pour rechercher des spécifications de langue pour le code I ").



1
votes

Les programmeurs C (dont j'ai été un pour plus de 20 ans) ont régulièrement utilisé des changements binaire pour multiplier ou diviser par des pouvoirs de 2. La raison était que dans les architectures plus anciennes (réfléchir à 2 processeur MHz, 32k de mémoire et Pas de disque) Il était significativement plus rapide de changer et généralement compilé vers une seule instruction de la machine. Même si j'écris principalement C # maintenant, je suis toujours en quête d'habitude, utilisez parfois ce truc. Une autre convention Conique C que la plupart des programmeurs C # n'ont jamais vu ont une mission intégrée dans un conditionnel. Par exemple:

if ( (a = getmeanumber()) == 0 )
   /* do something */ ;


0 commentaires