Bit Helper
//GNU Library General Public License (LGPL) //http://dac.codeplex.com/license using System; using System.Security; namespace RaisingStudio.Collections.Generic { internal class BitHelper { private const byte IntSize = 0x20; private int[] m_array; private unsafe int* m_arrayPtr; private int m_length; private const byte MarkedBitFlag = 1; private bool useStackAlloc; #if (PocketPC || Smartphone) #else [SecurityCritical] #endif internal unsafe BitHelper(int* bitArrayPtr, int length) { this.m_arrayPtr = bitArrayPtr; this.m_length = length; this.useStackAlloc = true; } internal BitHelper(int[] bitArray, int length) { this.m_array = bitArray; this.m_length = length; } [SecurityCritical] internal unsafe bool IsMarked(int bitPosition) { if (this.useStackAlloc) { int num = bitPosition / 0x20; return (((num < this.m_length) && (num >= 0)) && ((this.m_arrayPtr[num] & (((int)1) << (bitPosition % 0x20))) != 0)); } int index = bitPosition / 0x20; return (((index < this.m_length) && (index >= 0)) && ((this.m_array[index] & (((int)1) << (bitPosition % 0x20))) != 0)); } [SecurityCritical] internal unsafe void MarkBit(int bitPosition) { if (this.useStackAlloc) { int num = bitPosition / 0x20; if ((num < this.m_length) && (num >= 0)) { int* numPtr1 = this.m_arrayPtr + num; numPtr1[0] |= ((int)1) << (bitPosition % 0x20); } } else { int index = bitPosition / 0x20; if ((index < this.m_length) && (index >= 0)) { this.m_array[index] |= ((int)1) << (bitPosition % 0x20); } } } internal static int ToIntArrayLength(int n) { if (n <= 0) { return 0; } return (((n - 1) / 0x20) + 1); } } }