Count the number of bit

image_pdfimage_print

//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 } } [/csharp]

This entry was posted in Data Types. Bookmark the permalink.