See this answer of mine to a similar question: Looping through bits in an integer.
Here's the gist of it:
In Ruby, Integer
s (i.e. both Bignum
s and Fixnum
s) can already be indexed as if they were bit arrays. They are, however, not Enumerable
.
But you can fix that, of course:
class Integer
include Enumerable
def each
return to_enum unless block_given?
(size*8).times {|i| yield self[i] }
end
end
A slightly less intrusive way might be to represent the Integer
as an array:
class Integer
def to_a
Array.new(size*8, &method(:[]))
end
end
Then you can use Ruby's nifty Enumerable
methods:
5.to_a.map {|b| !b.zero? }
# => [true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]