1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
using System;
namespace TestEnum
{
class Program
{
static void Main(string[] args)
{
int valeur = 0;
while (true)
{
Console.Write("Entrez un nombre (ou autrechose pour sortir) : ");
string res = Console.ReadLine();
if (!int.TryParse(res, out valeur))
{
Console.WriteLine("Aurevoir et merci pour le poisson !");
break;
}
// Vérification simple : Rien > valeur > Tout
if (valeur < (int)TypeProduit.Rien || valeur > (int)TypeProduit.Tout)
{
Console.WriteLine("Vous avez tapé n'importe quoi !");
continue;
}
// Vérification simple : seul 1 bit doit être alumé
if (PopCount(valeur) != 1)
{
Console.WriteLine("Vous avez tapé n'importe quoi !");
continue;
}
TypeProduit produit = (TypeProduit)valeur;
if ((produit & TypeProduit.Fruit) == produit)
{
Console.WriteLine($"{produit} est un fruit");
}
else if ((produit & TypeProduit.Légume) == produit)
{
Console.WriteLine($"{produit} est un légume");
}
else if ((produit & TypeProduit.Fleur) == produit)
{
Console.WriteLine($"{produit} est une fleur");
}
else
{
Console.WriteLine("Vous avez tapé n'importe quoi !");
}
Console.WriteLine();
}
}
/// <summary>
/// Count the number of bits set to 1 in a int
/// </summary>
static byte PopCount(int value)
{
int result = value - ((value >> 1) & 0x55555555);
result = (result & 0x33333333) + ((result >> 2) & 0x33333333);
return (byte)(unchecked(((result + (result >> 4)) & 0xF0F0F0F) * 0x1010101) >> 56);
}
}
/// <summary>
/// On notera que les différents produits sont preprésentés en binaire avec un seul bit à vrai
/// </summary>
[Flags()]
enum TypeProduit : int
{
Rien = 0b00000000_00000000, // 0
Pomme = 0b00000000_00000001, // 1
Poire = 0b00000000_00000010, // 2
Abricot = 0b00000000_00000100, // 4
Cerise = 0b00000000_00001000, // 8
Tulipe = 0b00000000_00010000, // 16
Courgette = 0b00000000_00100000, // 32
Pomme_De_Terre = 0b00000000_01000000, // 64
Rose = 0b00000000_10000000, // 128
Radis = 0b00000001_00000000, // 256
Fruit = Pomme | Poire | Abricot | Cerise, // 1 + 2 + 4 + 8 = 15 = 0b00000000_00001111
Fleur = Rose | Tulipe, // 128 + 16 = 144 = 0b00000000_10010000
Légume = Courgette | Pomme_De_Terre | Radis, // 32 + 64 + 256 = 352 = 0b00000001_01100000
Tout = Fruit | Fleur | Légume // 15 + 144 + 352 = 511 = 0b00000001_11111111
}
} |
Partager