ビットの開始位置を右(右端を位置0)として。
scan_bits_index.rb
"10100100110".reverse.split('1',-1).inject([]){|ret,i| ret << i.size + (ret.last.nil? ? 0 : ret.last + 1); ret }[0..-2]
# => [1, 2, 5, 8, 10]
自分が必要だったのは左端から数えた位置だったので、ビットの開始位置を左から(左端を位置0)と考えるとこうなる。
scan_bits_index_from_left.rb
"10100100110".split('1',-1).inject([]){|ret,i| ret << i.size + (ret.last.nil? ? 0 : ret.last + 1); ret }[0..-2]
# => [0, 2, 5, 8, 9]