Est-il possible d'écrire en binaire littérales en C#, comme la préfixation hexadécimal avec 0x? 0b ne fonctionne pas.
Si non, quel est un moyen facile de le faire? Une sorte de conversion de chaîne de caractères?
Est-il possible d'écrire en binaire littérales en C#, comme la préfixation hexadécimal avec 0x? 0b ne fonctionne pas.
Si non, quel est un moyen facile de le faire? Une sorte de conversion de chaîne de caractères?
Puisque le sujet semble avoir tourné la déclaration de bits basés sur les valeurs d'indicateur dans les énumérations, j'ai pensé qu'il serait intéressant de montrer une astuce bien pratique pour ce genre de chose. Le décalage vers la gauche de l'opérateur (<<
) va vous permettre de pousser un peu à un binaire de la position. Combinez cela avec la possibilité de déclarer les valeurs de l'enum en termes de d'autres valeurs dans la même classe, et vous avez un très facile à lire syntaxe déclarative pour bit drapeau des enums.
[Flags]
enum Days
{
None = 0,
Sunday = 1,
Monday = 1 << 1, // 2
Tuesday = 1 << 2, // 4
Wednesday = 1 << 3, // 8
Thursday = 1 << 4, // 16
Friday = 1 << 5, // etc.
Saturday = 1 << 6,
Weekend = Saturday | Sunday,
Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday
}
C# 6.0 sera y compris le soutien pour les littéraux (et en option, chiffres séparateurs).
L'utilisation de ressembler à quelque chose comme ceci:
Int32 myValue = 0b0010_0110_0000_0011;
Vous pouvez également trouver plus d'informations sur le Roslyn page d'accueil.
Entiers et hex directement, j'ai peur (ECMA 334v4):
9.4.4.2 les littéraux Entiers les littéraux Entiers sont utilisés pour écrire les valeurs des les types int, uint, long, et ulong. Les littéraux entiers a deux formes: décimal et hexadécimal.
À l'analyse, vous pouvez utiliser:
int i = Convert.ToInt32("01101101", 2);
Vous pouvez toujours créer une quasi-littéraux, des constantes qui contient la valeur que vous êtes après:
const int b001 = 1;
const int b010 = 2;
const int b011 = 3;
// etc ...
Debug.Assert((b001 | b010) == b011);
Si vous les utilisez souvent, alors vous pouvez les envelopper dans une classe statique pour le ré-utiliser.
Cependant, slightliy hors-sujet, si vous en avez la sémantique associée avec les bits (connue au moment de la compilation), je vous recommande d'utiliser un Enum à la place:
enum Flags
{
First = 0,
Second = 1,
Third = 2,
SecondAndThird = 3
}
// later ...
Debug.Assert((Flags.Second | Flags.Third) == Flags.SecondAndThird);
Si vous regardez la fonctionnalité du langage état de mise en œuvre de l' .NET Compilateur Plate-forme ("Roslyn"), vous pouvez clairement voir qu'en C# 6.0 c'est une fonctionnalité prévue, donc dans la prochaine version, nous pouvons le faire de la manière habituelle.
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.