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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With