bitarray.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //this class allows for creation and manipulation of arrays which hold unique IDs, and allow for bitwise-like operation over these IDs
  2. //essentially, this extends single INT to any legth when it comes to holding and manipulating individual bits
  3. const int BIT_INT_SIZE = 32;
  4. class BitArray
  5. {
  6. static int IDToIndex(int id)
  7. {
  8. int m_NumOfItems = BitArray.IDToNumOfItems(id);
  9. int index = (id - (m_NumOfItems * BIT_INT_SIZE)) - 1;
  10. return index;
  11. }
  12. static int IDToMask(int id)
  13. {
  14. int index = BitArray.IDToIndex(id);
  15. int bit = 1 << index;
  16. return bit;
  17. }
  18. //! Creates an array which will be able to accomodate 'size' number of unique IDs
  19. static array<int> CreateMaskArray(int size)
  20. {
  21. int m_NumOfItems = BitArray.IDToNumOfItems(size);
  22. array<int> bit_array = new array<int>;
  23. for(int i = 0;i <= m_NumOfItems;i++)
  24. {
  25. bit_array.Insert(0);
  26. }
  27. return bit_array;
  28. }
  29. //! Returns number of bits this array can hold
  30. static int GetBitCount( array<int> bit_array )
  31. {
  32. return ( (bit_array.Count() ) * BIT_INT_SIZE );
  33. }
  34. //! Returns number of INTs required to hold this ID minus 1(ie for 32, the result is 0, for 33, the result is 1)
  35. static int IDToNumOfItems(int id)
  36. {
  37. int m_NumOfItems = id / BIT_INT_SIZE;
  38. if( id % BIT_INT_SIZE == 0 ) m_NumOfItems--;
  39. return m_NumOfItems;
  40. }
  41. static array<int> CreateArrayWithID(int id)
  42. {
  43. int m_NumOfItems = BitArray.IDToNumOfItems(id);//TODO: check for too big id
  44. int bit = BitArray.IDToMask(id);
  45. array<int> bit_array = new array<int>;
  46. for(int i = 0;i <= m_NumOfItems;i++)
  47. {
  48. bit_array.Insert(0);
  49. }
  50. bit_array.Set(m_NumOfItems, bit);
  51. return bit_array;
  52. }
  53. static bool IsMaskContainID(array<int> bit_array, int id)
  54. {
  55. if( BitArray.IDToNumOfItems( id ) > bit_array.Count() )
  56. {
  57. return false;
  58. }
  59. else
  60. {
  61. int index_mask = BitArray.IDToMask(id);
  62. int num_of_items = BitArray.IDToNumOfItems(id);
  63. int array_mask = bit_array.Get( num_of_items );
  64. if ( index_mask & array_mask )
  65. {
  66. return true;
  67. }
  68. else
  69. {
  70. return false;
  71. }
  72. }
  73. }
  74. static bool AddIDToMask(array<int> bit_array, int id)
  75. {
  76. if( BitArray.IDToNumOfItems(id) > bit_array.Count() )
  77. {
  78. return false;
  79. }
  80. else
  81. {
  82. int num_of_items = BitArray.IDToNumOfItems(id);
  83. int bit = BitArray.IDToMask(id);
  84. int new_mask = bit_array.Get(num_of_items) | bit;
  85. bit_array.Set(num_of_items, new_mask);
  86. return true;
  87. }
  88. }
  89. };