# Help with making this prettier?

What I want to do is to extract the integer value corresponding to a bit
field within a FixNum. That is, for example, what is the integer value
formed by bits 4,5,6,7,8 of a number?

This is my ugly first cut. There must be a library function that does
this but I can’t find it. Anyone have a pointer, that would be great!!
Or a suggestion on refactoring/rewriting this?

Thanks!

def bit_field(from, to, val)
accum = 0
ind = 0
from.upto(to) do |index|
bitval = val[index]
accum = accum + bitval * (2 ** ind)
ind = ind + 1
end
accum
end

def bit_field(from,to,val)
return ( val>>from ) & ( (2 << (to - from) ) - 1)
end
In binary 2<<(to-from) is going to be a 1 with (to-from+1) zeros after
it,
subtracting 1 leaves you with just (to-from+1) 1’s in the lower bits of
the
number.

val>>from shifts the bit field over to the lower bits.

Bitwise anding the two together masks off the upper order bits of val,
leaving you with the value you are looking for.

Chris Howe wrote:

def bit_field(from,to,val)
return ( val>>from ) & ( (2 << (to - from) ) - 1)
end
In binary 2<<(to-from) is going to be a 1 with (to-from+1) zeros after
it,
subtracting 1 leaves you with just (to-from+1) 1’s in the lower bits of
the
number.

val>>from shifts the bit field over to the lower bits.

Bitwise anding the two together masks off the upper order bits of val,
leaving you with the value you are looking for.

Thanks. Beautiful, and nice explanation too!

• Pito

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.