31 votes

FlagsAttribute Enum problem

Donc, je suis en train de construire un parc national de masoala (windows live messenger) du client. Et j'ai cette liste de fonctionnalités

public enum UserCapabilities : long
{
    None = 0,
    MobileOnline = 1 << 0,
    MSN8User = 1 << 1,
    RendersGif = 1 << 2,
    ....
    MsgrVersion7 = 1 << 30,
    MsgrVersion8 = 1 << 31,
    MsgrVersion9 = 1 << 32,
}

la liste complète ici http://paste.pocoo.org/show/383240/

Le serveur envoie à chacun des utilisateurs des capacités pour le client comme un entier long, ce qui, pour moi, et de le jeter à UserCapabilities

capabilities = Int64.Parse(e.Command.Args[3]);
user._capabilities = (UserCapabilities)capabilities;

Ce qui est bien, et avec au moins un utilisateur (avec une capacité de valeur de 1879474220), je peux le faire

Debug.WriteLine(_msgr.GetUser(usr).Capabilities);

et ce sera de sortie

RendersGif, RendersIsf, SupportsChunking, IsBot, SupportsSChannel, SupportsSipInvite, MsgrVersion5, MsgrVersion6, MsgrVersion7

Mais avec un autre utilisateur, qui a la capacité de la valeur de (3055849760), lorsque je fais la même chose, je viens d'obtenir le même nombre de sortie

3055849760

Ce que je voudrais voir est une liste de fonctionnalités, comme il est avec les autres utilisateurs.

Je suis sûr qu'il est un très raison valable pour que cela se produise, mais pas n'importe comment dur j'ai essayer de formuler la question à Google, je ne parviens pas à trouver une réponse.

Merci de m'aider :)

32voto

Marc Gravell Points 482669

La définition des opérateurs de décalage signifie que seuls les 5 bits de poids faible sont utilisés pour des nombres de 32 bits et seuls les 6 premiers bits pour 64 bits, ce qui signifie:

1 << 5

est identique à

1 << 37

(les deux sont 32)

En faisant ça:

MsgrVersion9 = 1L << 32

elle est d'un nombre de 64 bits, c'est pourquoi @leppie fixer les œuvres; autrement la << est considéré comme la première (et notez qu' 1<<32 est identique à 1<<0, c'est à dire 1), et alors la résultante 1 est convertie en long; donc, il est toujours 1.

De l'article 14.8 à l'ECMA spec:

Pour les prédéfinis des opérateurs, le nombre de bits de décalage est calculé comme suit:

  • Lorsque le type de x est int ou uint, le décalage est donné par la faible-de l'ordre de cinq bits de comte. En d'autres termes, le décalage est calculé à partir de count & 0x1F.
  • Lorsque le type de x est long ou ulong, le décalage est donné par le bas de six bits de comte. En d'autres termes, le décalage est calculé à partir de count & 0x3F.

Si le décalage est égal à zéro, les opérateurs de décalage de simplement renvoyer la valeur de x.

Des opérations de déplacement de ne jamais provoquer de débordements et de produire les mêmes résultats enregistrés et non cadre

10voto

leppie Points 67289

Le problème pourrait être avec débordement arithmétique.

Plus précisément à:

 MsgrVersion8 = 1 << 31,
MsgrVersion9 = 1 << 32,
 

Je vous suggère de le faire:

 MsgrVersion8 = 1L << 31,
MsgrVersion9 = 1L << 32,
 

Pour éviter les débordements accidentels.

Mise à jour:

Cela semble être le plus petit nombre «touche» 31 bits, tandis que le plus grand «touche» 32 bits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X