10
votes

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

Je suis assez nouveau à C # et en essayant de faire un logiciel de traitement d'image de base. Je comprends cet extraits d'extraits d'extraits A, R, G, B d'une valeur d'ARGB INT d'un pixel WriteOfbitMap "Courant" xxx

Qu'est-ce que ">>" faire pour convertir les valeurs?

En outre, si je fais des calculs sur R, G et B individuellement, comment puis-je les convertir à une valeur d'ARGB entier pour remplacer le pixel d'origine avec le nouveau?

Merci d'avance.

Edit: Merci gars, cela a du sens maintenant.


1 commentaires

C'est vraiment irritant de savoir que la structure de couleur dans Silverlight ne fournit pas de moyen de convertir un int32 à couleur .


3 Réponses :


12
votes

Il déplace les bits de la valeur code> actuelle code> à droite. Dans le cas de ce code particulier SNIPPIT, il semble extraire chaque octet des informations de couleur de l'élément de réseau bitmap sélectionné dans des octets de couleur individuels.

http://msdn.microsoft.com/en-us/library/xt18et0d.aspx p>

supposant que votre tableau contient INTS, pour récupérer une valeur calculée dans l'élément de tableau, vous inversez le processus de décalage de bits et les résultats, comme: P>

int current = (alpha << 24) | (red << 16) | (green << 8) | blue; 


7 commentaires

Je me demande ... est bitconverter.getbytes (actuel) trop compliqué? HM, peut-être trop lent pour une manipulation d'image sérieuse.


@Johannes: bitconverter est très rapide. J'imagine que ce serait approprié ici.


C'est une opération aussi simple, évidente et commune que je ne vois pas l'avantage d'utiliser quoi que ce soit que des opérateurs binaires. Si vous ne comprenez pas ce qui se passe, vous devriez apprendre ou rester à l'écart du traitement d'image (pas «vous» en particulier, juste en général)


Robert: vous obtiendrez un octet [] et vous n'en voulez probablement pas de nouveau pour chaque pixel; C'est la justification de mon édition "peut-être trop lente".


'int' est signé. Si la valeur alpha est supérieure à 127, il déborde et votre code va casser.


@Ed: Non, ça ne va pas. Vous obtiendrez un nombre de 32 bits négatifs. Bien qu'il s'agisse d'un numéro signé, il reste encore 32 bits que vous pouvez utiliser. Voir le commentaire de Lukeh ci-dessous sa réponse.


Tu as raison; Le trop-plein était le mauvais moyen de le mettre. Je suis juste utilisé pour utiliser explicitement des types non signés le cas échéant.



16
votes

C'est l'opérateur de changement de binaire.

Si vous avez une couleur définie par (A, R, G, B), sa représentation binaire ressemblerait à ceci (en supposant une profondeur de canal de 8 bits): P >

AAAAAAAARRRRRRRR &
0000000011111111
----------------
00000000RRRRRRRR


5 commentaires

+1. C'est une excellente explication, je me suis toujours demandé à propos de Bit Shifting et de la façon dont cela fonctionne. Si vous aviez le temps, il serait formidable de voir un exemple de la façon dont le problème change ci-dessus une valeur de couleur et comment. Comme comment change de changement de bit 128, 64, 256 à une autre valeur RVB. De plus, je ne suis toujours pas debout (octet) aaaaaaaarrrrrrr == rrrrrrrr (c'est-à-dire qu'il est extrait de droit à gauche?), Mais au moins je sais plus que ce que je faisais avant de visiter cette réponse.


@Taku: Le binaire est lu droit à gauche et dans ce cas, "les 8 premiers bits" signifie juste cela.


Si vous lancez (pixel & 0xFF00000000) à un octet, vous obtiendrez un zéro, peu importe ce que les 8 bits les plus à droite seront 0. Donc, je ne pense pas que votre dernier bloc est correct.


D'Oh! Tu as raison. C'est ce que je reçois pour essayer de répondre trop vite.


@Otaku: Comme le dit Junforce, vous n'êtes que de recadrer les 8 premiers bits et de la farce dans un octet. Le reste (c'est-à-dire quoi que ce soit> 255) est rejeté.



2
votes

Suite à la réponse de Robert - et pour couvrir la deuxième partie de votre question - vous pouvez combiner les composants séparés à un entier utilisant le (gauche-shift) et | code> (bitwise ou) opérateurs:

int combined = (alpha << 24) | (red << 16) | (green << 8) | blue;


1 commentaires

@ROBERT: L'OP ne spécifie pas, et je suppose que la philosophie, ce n'est ni - c'est juste un ensemble de 4 octets non signés. Si le Mécanisme de stockage est un int , mon code fonctionnera simplement bien (et le résultat sera un in int si la valeur alpha est supérieure que 127). Si le mécanisme de stockage est un uint , une nouvelle coulée supplémentaire serait requise.