Construct a BitRange.
Number of bits in each size_t
1 import core.stdc.stdlib : malloc, free; 2 import core.stdc.string : memset; 3 4 // initialize a bit array 5 enum nBytes = (100 + BitRange.bitsPerWord - 1) / 8; 6 size_t *bitArr = cast(size_t *)malloc(nBytes); 7 scope(exit) free(bitArr); 8 memset(bitArr, 0, nBytes); 9 10 // set some bits 11 bts(bitArr, 48); 12 bts(bitArr, 24); 13 bts(bitArr, 95); 14 bts(bitArr, 78); 15 16 enum sum = 48 + 24 + 95 + 78; 17 18 // iterate 19 size_t testSum; 20 size_t nBits; 21 foreach (b; BitRange(bitArr, 100)) 22 { 23 testSum += b; 24 ++nBits; 25 } 26 27 assert(testSum == sum); 28 assert(nBits == 4);
Range over bit set. Each element is the bit number that is set.
This is more efficient than testing each bit in a sparsely populated bit set. Note that the first bit in the bit set would be bit 0.