# Method to set the bits to "on" in an interval in a bit array.
# Returns the number of bits set.
def interval_set(start, stop)
- raise BitArrayError, "interval start < 0 (#{start} < 0)" if start < 0
+ raise BitArrayError, "interval start < 0 (#{start} < 0)" if start < 0
raise BitArrayError, "interval stop > bit array size (#{stop} > #{self.size})" if stop > self.size
- raise BitArrayError, "interval stop < interval start (#{stop} < #{start})" if stop < start
+ raise BitArrayError, "interval stop < interval start (#{stop} < #{start})" if stop < start
- (start ... stop).each do |pos|
- self.bit_set(pos)
+ mask = (2 ** BitsInChar) - 1 # 11111111
+
+ bits_start = start % BitsInChar
+ bits_stop = stop % BitsInChar
+
+ mask_start = mask >> bits_start
+ mask_stop = mask << (BitsInChar - bits_stop)
+
+ self.byte_array[start / BitsInChar] |= mask_start if (stop / BitsInChar) != (start / BitsInChar)
+ self.byte_array[stop / BitsInChar] |= mask_stop
+
+ byte_start = (start + BitsInChar - bits_start) / BitsInChar
+ byte_stop = stop / BitsInChar
+
+ (byte_start ... byte_stop).each do |pos|
+ self.byte_array[pos] |= mask
end
stop - start
# Method to set the bits to "off" in an interval in a bit array.
# Returns the number of bits unset.
def interval_unset(start, stop)
- raise BitArrayError, "interval start < 0 (#{start} < 0)" if start < 0
+ raise BitArrayError, "interval start < 0 (#{start} < 0)" if start < 0
raise BitArrayError, "interval stop > bit array size (#{stop} > #{self.size})" if stop > self.size
- raise BitArrayError, "interval stop < interval start (#{stop} < #{start})" if stop < start
+ raise BitArrayError, "interval stop < interval start (#{stop} < #{start})" if stop < start
(start ... stop).each do |pos|
self.bit_unset(pos)