@@ -24,56 +24,61 @@ using namespace std::chrono;
24
24
const uint64_t DEFAULT_UPPER_LIMIT = 10'000' 000LLU;
25
25
26
26
class BitArray {
27
- uint32_t *array;
27
+ uint8_t *array;
28
28
size_t arrSize;
29
29
30
30
inline static size_t arraySize (size_t size)
31
31
{
32
- return (size >> 5 ) + ((size & 31 ) > 0 );
32
+ return (size >> 3 ) + ((size & 7 ) > 0 );
33
33
}
34
34
35
35
inline static size_t index (size_t n)
36
36
{
37
- return (n >> 5 );
37
+ return (n >> 3 );
38
38
}
39
39
40
- inline static uint32_t getSubindex (size_t n, uint32_t d)
40
+ inline static uint8_t getSubindex (size_t n, uint8_t d)
41
41
{
42
- return d & uint32_t ( uint32_t (0x01 ) << (n % 32 ));
42
+ return d & uint8_t ( uint8_t (0x01 ) << (n % 8 ));
43
43
}
44
44
45
- inline void setFalseSubindex (size_t n, uint32_t &d)
45
+ inline void setFalseSubindex (size_t n, uint8_t &d)
46
46
{
47
- d &= ~uint32_t ( uint32_t (0x01 ) << (n % ( 8 * sizeof ( uint32_t )) ));
47
+ d &= ~uint8_t ( uint8_t (0x01 ) << (n % 8 ));
48
48
}
49
49
50
50
public:
51
51
explicit BitArray (size_t size) : arrSize(size)
52
52
{
53
- array = new uint32_t [arraySize (size)];
54
- std::memset (array, 0xFF , (size >> 3 ) + ((size & 7 ) > 0 ));
53
+ array = new uint8_t [arraySize (size)];
54
+ std::memset (array, 0xFF , arraySize (size));
55
55
}
56
56
57
- ~BitArray () {delete [] array;}
57
+ ~BitArray () { delete [] array; }
58
58
59
59
bool get (size_t n) const
60
60
{
61
- return getSubindex (n, array[index (n)]) ;
61
+ return ( array[index (n)] & ( uint8_t ( 1 ) << (n % 8 ))) != 0 ;
62
62
}
63
63
64
- static constexpr uint32_t rol (uint32_t x, uint32_t n)
64
+ static constexpr uint8_t rol (uint8_t x, uint8_t n)
65
65
{
66
- return (x<<n) | (x>>(32 -n));
66
+ n %= 8 ;
67
+ if (n == 0 )
68
+ return x;
69
+ else
70
+ return (x << n) | (x >> (8 - n));
67
71
}
68
72
69
73
void setFlagsFalse (size_t n, size_t skip)
70
74
{
71
- auto rolling_mask = ~uint32_t (1 << n % 32 );
72
- auto roll_bits = skip % 32 ;
75
+ auto rolling_mask = ~uint8_t (1 << n % 8 );
76
+ auto roll_bits = skip % 8 ;
73
77
while (n < arrSize) {
74
78
array[index (n)] &= rolling_mask;
75
79
n += skip;
76
- rolling_mask = rol (rolling_mask, roll_bits);
80
+ if (roll_bits != 0 )
81
+ rolling_mask = rol (rolling_mask, roll_bits);
77
82
}
78
83
}
79
84
0 commit comments