Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Counting the number of flags set on an enumeration

Tags:

I'm sure there must be a much better way of doing this. I'm trying to do a count operation on a Flags enum. Before I was itterating over all the possible values and counting the succesful AND operations.

e.g.

[Flags] public enum Skills {     None = 0,     Skill1 = 1,     Skill2 = 2,     Skill3 = 4,     Skill4 = 8,     Skill5 = 16,     Skill6 = 32,     Skill7 = 64,     Skill8 = 128 }  public static int Count(Skills skillsToCount) {    Skills skill;    for (int i = 0; i < SkillSet.AllSkills.Count; i++)    {       skill = SkillSet.AllSkills[i];       if ((skillsToCount & skill) == skill && skill != Skills.None)          count++;    }    return count; } 

I'm sure there must be a better way of doing this though, but must be suffering from a mental block. Can anyone advise a nicer solution?

like image 874
Ian Avatar asked Mar 24 '09 12:03

Ian


1 Answers

The following code will give you the number of bits that are set for a given number of any type varying in size from byte up to long.

public static int GetSetBitCount(long lValue) {   int iCount = 0;    //Loop the value while there are still bits   while (lValue != 0)   {     //Remove the end bit     lValue = lValue & (lValue - 1);      //Increment the count     iCount++;   }    //Return the count   return iCount; } 

This code is very efficient as it only iterates once for each bit rather than once for every possible bit as in the other examples.

like image 191
stevehipwell Avatar answered Oct 13 '22 00:10

stevehipwell