Mega Code Archive

 
Categories / C# / Data Types
 

Count the number of bit

//http://extensionlibrary.codeplex.com/ //The MIT License (MIT) using System; using System.Collections.Generic; using System.Text; namespace ExtensionLibrary.Tools {     public static class BitOperator     {         #region Count the number of bit one          public static int GetCountOfBitOne(sbyte x)         {             int result = 0;             while (x != 0)             {                 result++;                 x &= (sbyte)(x - 1);             }             return result;         }         public static int GetCountOfBitOne(short x)         {             int result = 0;             while (x != 0)             {                 result++;                 x &= (short)(x - 1);             }             return result;         }         public static int GetCountOfBitOne(int x)         {             int result = 0;             while (x != 0)             {                 result++;                 x &= (x - 1);             }             return result;         }         public static int GetCountOfBitOne(long x)         {             int result = 0;             while (x!=0)             {                 result++;                 x &= (x - 1);             }             return result;         }         public static int GetCountOfBitOne(byte x)         {             int result = 0;             while (x != 0)             {                 result++;                 x &= (byte)(x - 1);             }             return result;         }         public static int GetCountOfBitOne(ushort x)         {             int result = 0;             while (x != 0)             {                 result++;                 x &= (ushort)(x - 1);             }             return result;         }         public static int GetCountOfBitOne(uint x)         {             int result = 0;             while (x != 0)             {                 result++;                 x &= (x - 1);             }             return result;         }         public static int GetCountOfBitOne(ulong x)         {             int result = 0;             while (x != 0)             {                 result++;                 x &= (x - 1);             }             return result;         }         #endregion         #region Count the number of bit zero         public static int GetCountOfBitZero(sbyte x)         {             return GetCountOfBitOne(~x);         }         public static int GetCountOfBitZero(short x)         {             return GetCountOfBitOne(~x);         }         public static int GetCountOfBitZero(int x)         {             return GetCountOfBitOne(~x);         }         public static int GetCountOfBitZero(long x)         {             return GetCountOfBitOne(~x);         }         public static int GetCountOfBitZero(byte x)         {             return GetCountOfBitOne(~x);         }         public static int GetCountOfBitZero(ushort x)         {             return GetCountOfBitOne(~x);         }         public static int GetCountOfBitZero(uint x)         {             return GetCountOfBitOne(~x);         }         public static int GetCountOfBitZero(ulong x)         {             return GetCountOfBitOne(~x);         }         #endregion         #region Get number of leading zero         public static int GetNumberOfLeadingZero(sbyte x)         {             int number = 8;                          sbyte y = (sbyte)(x >> 4);              if (y != 0)             {                 number -= 4;                 x = y;             }             y = (sbyte)(x >> 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (sbyte)(x >> 1);             if (y != 0)             {                 return number - 2;             }             return number - x;         }         public static int GetNumberOfLeadingZero(short x)         {             int number = 16;             short y = (short)(x >> 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (short)(x >> 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (short)(x >> 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (short)(x >> 1);             if (y != 0)             {                 return number - 2;             }             return number - x;         }         public static int GetNumberOfLeadingZero(int x)         {             int number = 32;             int y = (x >> 16);             if (y != 0)             {                 number -= 16;                 x = y;             }             y = (x >> 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (x >> 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (x >> 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (x >> 1);             if (y != 0)             {                 return number - 2;             }             return number - x;         }         public static int GetNumberOfLeadingZero(long x)         {             int number = 64;             long y = (x >> 32);             if (y != 0)             {                 number -= 32;                 x = y;             }             y = (x >> 16);             if (y != 0)             {                 number -= 16;                 x = y;             }             y = (x >> 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (x >> 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (x >> 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (x >> 1);             if (y != 0)             {                 return number - 2;             }             return (int)(number - x);         }         public static int GetNumberOfLeadingZero(byte x)         {             int number = 8;             byte y = (byte)(x >> 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (byte)(x >> 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (byte)(x >> 1);             if (y != 0)             {                 return number - 2;             }             return number - x;         }         public static int GetNumberOfLeadingZero(ushort x)         {             int number = 16;             ushort y = (ushort)(x >> 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (ushort)(x >> 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (ushort)(x >> 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (ushort)(x >> 1);             if (y != 0)             {                 return number - 2;             }             return number - x;         }         public static int GetNumberOfLeadingZero(uint x)         {             int number = 32;             uint y = (x >> 16);             if (y != 0)             {                 number -= 16;                 x = y;             }             y = (x >> 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (x >> 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (x >> 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (x >> 1);             if (y != 0)             {                 return number - 2;             }             return (int)(number - x);         }         public static int GetNumberOfLeadingZero(ulong x)         {             int number = 64;             ulong y = (x >> 32);             if (y != 0)             {                 number -= 32;                 x = y;             }             y = (x >> 16);             if (y != 0)             {                 number -= 16;                 x = y;             }             y = (x >> 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (x >> 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (x >> 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (x >> 1);             if (y != 0)             {                 return number - 2;             }             return number - (int)x;         }         #endregion         #region Get number of leading one         public static int GetNumberOfLeadingOne(sbyte x)         {             return GetNumberOfLeadingZero(~x);         }         public static int GetNumberOfLeadingOne(short x)         {             return GetNumberOfLeadingZero(~x);         }         public static int GetNumberOfLeadingOne(int x)         {             return GetNumberOfLeadingZero(~x);         }         public static int GetNumberOfLeadingOne(long x)         {             return GetNumberOfLeadingZero(~x);         }         public static int GetNumberOfLeadingOne(byte x)         {             return GetNumberOfLeadingZero(~x);         }         public static int GetNumberOfLeadingOne(ushort x)         {             return GetNumberOfLeadingZero(~x);         }         public static int GetNumberOfLeadingOne(uint x)         {             return GetNumberOfLeadingZero(~x);         }         public static int GetNumberOfLeadingOne(ulong x)         {             return GetNumberOfLeadingZero(~x);         }         #endregion         #region Get number of tailing zero         public static int GetNumberOfTailingZero(sbyte x)         {             if (x == 0)                  return 8;             int number = 7;             sbyte y = (sbyte)(x << 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (sbyte)(x << 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (sbyte)(x << 1);             if (y != 0)             {                 number--;             }             return number;         }         public static int GetNumberOfTailingZero(short x)         {             if (x == 0)                 return 16;             int number = 15;             short y = (short)(x << 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (short)(x << 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (short)(x << 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (short)(x << 1);             if (y != 0)             {                 number--;             }             return number;         }         public static int GetNumberOfTailingZero(int x)         {             if (x == 0)                 return 32;             int number = 31;             int y = (x << 16);             if (y != 0)             {                 number -= 16;                 x = y;             }             y = (x << 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (x << 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (x << 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (x << 1);             if (y != 0)             {                 number--;             }             return number;         }         public static int GetNumberOfTailingZero(long x)         {             if (x == 0)                 return 64;             int number = 63;             long y = (x << 32);             if (y != 0)             {                 number -= 32;                 x = y;             }             y = (x << 16);             if (y != 0)             {                 number -= 16;                 x = y;             }             y = (x << 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (x << 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (x << 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (x << 1);             if (y != 0)             {                 number--;             }             return number;         }         public static int GetNumberOfTailingZero(byte x)         {             if (x == 0)                 return 8;             int number = 7;             byte y = (byte)(x << 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (byte)(x << 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (byte)(x << 1);             if (y != 0)             {                 number--;             }             return number;         }         public static int GetNumberOfTailingZero(ushort x)         {             if (x == 0)                 return 16;             int number = 15;             ushort y = (ushort)(x << 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (ushort)(x << 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (ushort)(x << 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (ushort)(x << 1);             if (y != 0)             {                 number--;             }             return number;         }         public static int GetNumberOfTailingZero(uint x)         {             if (x == 0)                 return 32;             int number = 31;             uint y = (x << 16);             if (y != 0)             {                 number -= 16;                 x = y;             }             y = (x << 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (x << 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (x << 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (x << 1);             if (y != 0)             {                 number--;             }             return number;         }         public static int GetNumberOfTailingZero(ulong x)         {             if (x == 0)                 return 64;             int number = 63;             ulong y = (x << 32);             if (y != 0)             {                 number -= 32;                 x = y;             }             y = (x << 16);             if (y != 0)             {                 number -= 16;                 x = y;             }             y = (x << 8);             if (y != 0)             {                 number -= 8;                 x = y;             }             y = (x << 4);             if (y != 0)             {                 number -= 4;                 x = y;             }             y = (x << 2);             if (y != 0)             {                 number -= 2;                 x = y;             }             y = (x << 1);             if (y != 0)             {                 number--;             }             return number;         }         #endregion         #region Get number of tailing one         public static int GetNumberOfTailingOne(sbyte x)         {             return GetNumberOfTailingOne(~x);         }         public static int GetNumberOfTailingOne(short x)         {             return GetNumberOfTailingOne(~x);         }         public static int GetNumberOfTailingOne(int x)         {             return GetNumberOfTailingOne(~x);         }         public static int GetNumberOfTailingOne(long x)         {             return GetNumberOfTailingOne(~x);         }         public static int GetNumberOfTailingOne(byte x)         {             return GetNumberOfTailingOne(~x);         }         public static int GetNumberOfTailingOne(ushort x)         {             return GetNumberOfTailingOne(~x);         }         public static int GetNumberOfTailingOne(uint x)         {             return GetNumberOfTailingOne(~x);         }         public static int GetNumberOfTailingOne(ulong x)         {             return GetNumberOfTailingOne(~x);         }         #endregion     } }